0

我正在尝试创建模板类,每个模板类都可以解决问题的特定方面,以便能够在不求助于创建传统抽象虚拟类的情况下将它们混搭。为此,我相信 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 ) {

这是编译器错误还是实际的预期结果?

4

1 回答 1

0

reddit.com/r/cpp上的用户pubby8回复(引用)一个快速解决方法是将其添加到 Derived 的类主体:

using A<Derived>::foo;

using B<Derived>::foo;
于 2015-06-03T05:44:44.743 回答