Алмазное наследование с бустом :: bind

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

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: «новая строка»: неоднозначные преобразования из «бетона» *
в ‘A *’
с
[
Т = TConcrete
]

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

1

Решение

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

           Concrete
|
D
/ \
C   B
/     \
A       A

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

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

           Concrete
|
D
/ \
C   B
\ /
A
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector