我正在使用curiously recurring template pattern to model static polymorphism。
这非常正常,直到有人引入virtual inheritance
(以解决diamond problem
)。
然后编译器(Visual Studio 2013)开始抱怨
error C2635: cannot convert a 'Base*' to a 'Derived*'; conversion from a virtual base class is implied
基本上,此转化为not allowed。
为什么? 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();
}
答案 0 :(得分:2)
根据我的发现,这些不能合并。
curiously recurring template pattern
的要点是在编译时解析调用。
正如T.C.所指出的那样。在评论中,virtual inheritance
无法在运行时解决。
这意味着两个人不要混在一起,而且必须给予。