Frage

Ich habe ein Design wie dieses:

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

Der Compiler beschwert sich über den ersten boost::bind-Aufruf.Der Funktionsaufruf in C und D weist keine Probleme auf.Hier der genaue Fehler:

boost/bind/mem_fn_template.hpp(384) :Fehler C2594:'Neue Zeile' :Mehrdeutige Konvertierungen von 'Beton *' zu 'a *' mit [t = tconcrete

Irgendwelche Ideen, was daran falsch sein könnte?

War es hilfreich?

Lösung

Ihr Vererbungsdiagramm sieht in etwa so aus:

           Concrete 
              |
              D
             / \
            C   B
           /     \
          A       A

Wenn Sie versuchen, Ihre zu konvertieren Concrete* In ein A*, der Compiler hat keine Ahnung, welche Instanz von A Sie wollen.Möchten Sie in die konvertieren A Das C leitet sich ab, oder die A Das B kommt von?

Die Lösung besteht darin, die virtuelle Vererbung zum Ableiten zu verwenden B Und C aus A, so dass es nur eine Instanz von gibt A.

           Concrete 
              |
              D
             / \
            C   B
             \ /
              A
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top