2

我正在使用奇怪重复的模板模式来模拟静态多态性

这工作得很好,直到有人介绍virtual inheritance(解决 a diamond problem)。

然后编译器(Visual Studio 2013)开始抱怨

error C2635: cannot convert a 'Base*' to a 'Derived*'; conversion from a virtual base class is implied

基本上,这种转换是不允许的。

这是为什么?两者都static_cast失败c-style cast

有没有不放弃其中一个的解决方案?

编辑:

这是一个示例(删除虚拟并且它可以工作):

template <class Derived> 
struct Base
{
    void interface()
    {
        static_cast<Derived*>(this)->implementation();
    }
};

struct Derived : virtual Base<Derived>
{
    void implementation() { std::cout << "hello"; }
};

int main()
{
    Derived d;
    d.interface();
}
4

1 回答 1

2

据我所知,这些不能合并。

的重点curiously recurring template pattern是在编译时解决调用。

正如 TC 在评论中指出的那样,virtual inheritance直到运行时才能解决。

这意味着两者不混合,一个必须给予。

于 2014-05-30T12:19:11.527 回答