1

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

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));
}

コンパイラは、最初の boost::bind 呼び出しについて不平を言います。C および D 内の関数の呼び出しには問題はありません。正確なエラーは次のとおりです。

boost/bind/mem_fn_template.hpp(384): エラー C2594: 'newline': [T=TConcrete] を使用した 'Concrete *' から 'A *' へのあいまいな変換

これの何が問題なのですか?

4

1 に答える 1

1

継承図は次のようになります。

           Concrete 
              |
              D
             / \
            C   B
           /     \
          A       A

を に変換しようとするとConcrete*A*コンパイラは必要なインスタンスを認識Aできません。から派生した に変換しますか、または から派生したAに変換しますか?CAB

解決策は、仮想継承を使用してBCから派生させA、 のインスタンスが 1 つだけになるようにすることですA

           Concrete 
              |
              D
             / \
            C   B
             \ /
              A
于 2013-11-07T21:46:26.627 に答える