Question

J'ai un design comme ceci:

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

Le compilateur se plaint du premier coup de boost :: Bind. L'appel à fonctionner à l'intérieur de C et D n'a aucun problème. Voici l'erreur exacte:

boost / bind / mem_fn_template.hpp (384): erreur C2594: 'newline': conversions ambiguës de 'Concrete *' à 'a *' avec [t = tConcrete

Des idées, qu'est-ce qui pourrait ne pas mal parvenir à cela?

Était-ce utile?

La solution

Votre diagramme d'héritage ressemble à ceci:

           Concrete 
              |
              D
             / \
            C   B
           /     \
          A       A

Lorsque vous essayez de convertir votre Concrete* en un A*, le compilateur n'a aucune idée de quelle instance de A tu veux. Voulez-vous convertir au A ce C dérive de, ou le A ce B dérive de?

La solution consiste à utiliser l'héritage virtuel pour dériver B et C de A, de sorte qu'il n'y a qu'un seul cas de A.

           Concrete 
              |
              D
             / \
            C   B
             \ /
              A
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top