У меня есть такой дизайн:
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
]
Есть идеи, что может быть не так с этим?
Ваша диаграмма наследования выглядит примерно так:
Concrete
|
D
/ \
C B
/ \
A A
Когда вы пытаетесь конвертировать ваши Concrete*
в A*
Компилятор не знает, какой экземпляр A
ты хочешь. Вы хотите преобразовать в A
тот C
происходит от или A
тот B
происходит от?
Решение заключается в использовании виртуального наследования для получения B
а также C
от A
, так что есть только один экземпляр A
,
Concrete
|
D
/ \
C B
\ /
A
Других решений пока нет …