关于C++:奇怪的重复模板模式和虚拟继承

curiously recurring template pattern and virtual inheritance

我使用奇怪的重复模板模式来建模静态多态性。

在引入virtual inheritance之前,这是完全可行的(解决diamond problem)。

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

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

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

为什么会这样?static_castc-style cast都失败了。

有没有一个解决办法不包括放弃一个或另一个?

编辑:

这里有一个示例(移除虚拟的,它就可以工作了):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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();
}


从我的发现来看,这些是不能组合的。

curiously recurring template pattern的要点是在编译时解析调用。

正如T.C.在评论中指出的,virtual inheritance直到运行时才能解决。

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