Domanda

Ho un design come questo:

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

Il compilatore si lamenta della prima chiamata di boost :: Bind. La chiamata per funzionare all'interno di C e D non ha problemi. Ecco l'errore esatto:

boost/bind/mem_fn_template.hpp (384): errore c2594: "newline": conversioni ambigue da "concrete *a" a *"con [t = tconcrete

Qualche idea su cosa potrebbe essere sbagliato in questo?

È stato utile?

Soluzione

Il tuo diagramma di eredità assomiglia a questo:

           Concrete 
              |
              D
             / \
            C   B
           /     \
          A       A

Quando provi a convertire il tuo Concrete* in un A*, il compilatore non ha idea di quale istanza A tu vuoi. Vuoi convertirsi in A Quello C deriva da o dal A Quello B deriva da?

La soluzione è utilizzare l'eredità virtuale per derivare B e C da A, in modo che ci sia solo un'istanza di A.

           Concrete 
              |
              D
             / \
            C   B
             \ /
              A
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top