Я пытаюсь заменить виртуальные функции шаблонов:Заменить виртуальные функции шаблонов
struct Derived1;
struct Derived2;
template <typename T>
struct Base
{
void f();
};
template<>
void Base::f<Derived1>(){std::cout<<"Derived1\n";}
template<>
void Base::f<Derived2>(){std::cout<<"Derived2\n";}
struct Derived1 : public Base {};
struct Derived2 : public Base {};
Он работает, пока мы не создадим контейнер указателей:
std::vector<Base*> vec;//doesn't work - needs explicit parameter for Base
vec.push_back(new Derived1);
vec[0]->f();//Call f() from Derived1
Можно ли избавиться от «виртуальность» в этом случае?
Взгляните на CRTP. Я только когда-либо видел это немного иначе. – chris
Там вообще нет ключевого слова 'virtual'. Специализация шаблона не похожа на «виртуальную». Вопрос очень неясен, потому что вы просите получить * rid * от виртуальности, но в первую очередь нет. – Potatoswatter
'Base :: f()' специализация тоже не выглядит правильно. Функция-член 'Base :: f' не является функцией шаблона, но ваше определение специализируется на' Base :: f ', что не имеет никакого смысла. Вы пробовали компилировать этот код? –
greatwolf