我正在尝试创建模板类,每个模板类都可以解决问题的特定方面,以便能够在不求助于创建传统抽象虚拟类的情况下将它们混搭。为此,我相信 CRTP 将是最好的范例。但是,当更多地使用 CRTP 时,我发现这种弱解析逻辑陷入了困境 - 编译器 (g++ 4.8.2) 无法区分不同类上的两个方法,即使它们的签名不同 - 只有方法名称是相同的。
类实现:
template< class T >
class A {
public:
void foo( uint32_t val ) {
T* me = static_cast<T*>( this );
me->doit();
}
};
template< class T >
class B {
public:
void foo() {
uint32_t v32 = 10;
T* me = static_cast<T*>( this );
me->foo( v32 );
}
};
class Derived : public A<Derived>,
public B<Derived>
{
public:
void doit() {
std::cout << "here" << std::endl;
}
};
然后它被用作
Derived d;
d.foo();
编译时,此错误浮出水面:
$ g++ -std=c++11 -c testLambda.cpp
testLambda.cpp: In function ‘int main(int, char**)’:
testLambda.cpp:102:7: error: request for member ‘foo’ is ambiguous
d.foo();
^
testLambda.cpp:25:10: note: candidates are: void B<T>::foo() [with T = Derived]
void foo() {
^
testLambda.cpp:16:10: note: void A<T>::foo(uint32_t) [with T = Derived; uint32_t = unsigned int]
void foo( uint32_t val ) {
这是编译器错误还是实际的预期结果?