0

私は、それぞれが問題の特定の側面を解決できるテンプレート クラスを作成して、従来の抽象仮想クラスの作成に頼らずにそれらをごちゃまぜにできるようにしようとしています。そのためには、CRTP が最適なパラダイムになると思います。ただし、CRTP をもう少し使用すると、この弱い解決ロジックに閉じ込められていることがわかりました。コンパイラ (g++ 4.8.2) は、署名が異なっていても、異なるクラスの 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 に答える