Вопрос

У меня есть такой дизайн:

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

Компилятор жалуется на первый вызов Boost :: Bind. Призыв к функционированию внутри C и D не имеет проблем. Вот точная ошибка:

Boost/Bind/mem_fn_template.hpp (384): ошибка C2594: 'newline': неоднозначные преобразования из «Concrete *» в 'a *' с [t = tconcrete

Есть идеи, что может быть не так с этим?

Это было полезно?

Решение

Ваша диаграмма наследования выглядит примерно так:

           Concrete 
              |
              D
             / \
            C   B
           /     \
          A       A

Когда вы пытаетесь преобразовать свой Concrete* в A*, компилятор понятия не имеет, какой экземпляр A ты хочешь. Вы хотите конвертировать в A что C происходит от или A что B происходит от?

Решение состоит в том, чтобы использовать виртуальное наследование, чтобы получить B а также C из A, так что есть только один экземпляр A.

           Concrete 
              |
              D
             / \
            C   B
             \ /
              A
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top