Я использую любопытно повторяющийся шаблон для моделирования статического полиморфизма.
Это работает абсолютно нормально, пока не представишь 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_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();
}
Из того, что я узнал, они не могут быть объединены.
Суть curiously recurring template pattern
это разрешить вызов во время компиляции.
Как указывает Т.С. в комментариях, virtual inheritance
не может быть решена до времени выполнения.
Что означает, что двое не смешиваются, а один должен дать.