私は、それぞれが問題の特定の側面を解決できるテンプレート クラスを作成して、従来の抽象仮想クラスの作成に頼らずにそれらをごちゃまぜにできるようにしようとしています。そのためには、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 ) {
これはコンパイラのバグですか、それとも実際に期待される結果ですか?