質問

私はこのようなデザインを持っています:

template <class T>
class A
{
};

template <class T>
class B : public A<T> 
{
};

template <class T>
class C : public A<T> 
{
};

template <class T>
class D : public C<T>, public B<T> 
{
};

struct TConcrete {
int xyz;
};

class Concrete : public D<TConcrete>
{
void Foo();
};

void
Concrete::Foo()
{
Bar (boost::bind(&A::Afunc, this, _1, _2), boost::bind(&C::Cfunc, this, _1, _2),     boost::bind(&D::Dfunc, this, _1, _2));
}

コンパイラは、最初のブースト::バインドコールについて不平を言います。 CおよびD内の機能への呼び出しは問題ありません。これが正確なエラーです:

boost/bind/mem_fn_template.hpp(384):エラーC2594: 'newline': 'concrete *'から 'a *'へのあいまいな変換[t = tconcrete

これで何が悪いのかというアイデアはありますか?

役に立ちましたか?

解決

あなたの継承図は次のように見えます:

           Concrete 
              |
              D
             / \
            C   B
           /     \
          A       A

あなたがあなたを変換しようとするとき Concrete*A*, 、コンパイラにはどのインスタンスがわかりません A あなたが欲しい。に変換しますか A それ C から派生します A それ B から派生?

解決策は、仮想継承を使用して導出することです BC から A, 、そのため、1つのインスタンスしかありません A.

           Concrete 
              |
              D
             / \
            C   B
             \ /
              A
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top