Pregunta

Tengo un diseño 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));
}

El compilador se queja de la primera llamada Boost :: Bind. La llamada a la función dentro de C y D no tiene problemas. Aquí está el error exacto:

boost/bind/mem_fn_template.hpp (384): Error C2594: 'Newline': conversiones ambiguas de 'Concrete *' a 'a *' con [t = tConcrete

¿Alguna idea de qué podría estar mal con esto?

¿Fue útil?

Solución

Su diagrama de herencia se parece a esto:

           Concrete 
              |
              D
             / \
            C   B
           /     \
          A       A

Cuando intentas convertir tu Concrete* en una A*, el compilador no tiene idea de qué instancia de A usted quiere. ¿Quieres convertirte al A que C deriva de o el A que B ¿deriva de?

La solución es usar la herencia virtual para derivar B y C de A, de modo que solo hay una instancia de A.

           Concrete 
              |
              D
             / \
            C   B
             \ /
              A
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top