1

我有这样的设计:

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]

任何想法这可能有什么问题?

4

1 回答 1

1

您的继承图如下所示:

           Concrete 
              |
              D
             / \
            C   B
           /     \
          A       A

当您尝试将您Concrete*的转换为时,编译器不知道您想要A*哪个实例。A你想转换成A那个C派生的,还是A那个B派生的?

解决方法是使用虚拟继承来派生BCA,这样就只有一个A.

           Concrete 
              |
              D
             / \
            C   B
             \ /
              A
于 2013-11-07T21:46:26.627 回答