Pergunta

Eu tenho um design como este:

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

O compilador reclama do primeiro Boost :: Bind Call. A chamada para funcionar dentro de C e D não tem problemas. Aqui está o erro exato:

boost/bind/mem_fn_template.hpp (384): erro c2594: 'newline': conversões ambíguas de 'concreto *' para 'a *' com [t = tCanCrete

Alguma idéia do que poderia estar errado com isso?

Foi útil?

Solução

Seu diagrama de herança se parece com o seguinte:

           Concrete 
              |
              D
             / \
            C   B
           /     \
          A       A

Quando você tenta converter seu Concrete* em um A*, o compilador não tem idéia de qual instância de A você quer. Você quer converter para o A este C deriva de ou do A este B deriva de?

A solução é usar a herança virtual para derivar B e C a partir de A, para que exista apenas uma instância de A.

           Concrete 
              |
              D
             / \
            C   B
             \ /
              A
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top