2014-09-09 2 views
0

У меня есть интерфейс и я пытаюсь сделать мой templated класс реализовать этот интерфейс. Простой пример, чтобы продемонстрировать проблемы является:C++: использование шаблона класса для реализации абстрактного класса

class Base{ 

    virtual void do_something(int a) = 0; 
    virtual ~Base(); 

}; 

template<typename T> 
class Concrete : Base{ 

    T _t; 
    Concrete(T t):_t(t){}; 
    virtual void do_something(int a); 
}; 

template<typename T> 
virtual void Concrete<T>::do_something(int a){ 
    std::cout << a << std::endl; 
} 

int main(int argc, char **argv) { 

    Concrete<int> c; 
    c.do_something(5); 
} 

Однако компилятор жалуется:

error: templates may not be 'virtual' 
virtual void Concrete<T>::do_something(int a){ 

Есть ли способ, чтобы добиться такого поведения?

+4

Удалить ключевое слово из определения функции. Это достаточно, чтобы иметь его в объявлении внутри класса. –

ответ

4

Да, что н.м. сказал. сообщение об ошибке лязгом является немного более полезным здесь:

so.cpp:19:1: error: 'virtual' can only be specified inside the class definition 
virtual void Concrete<T>::do_something(int a){ 
^~~~~~~~ 

Удалить виртуальный ключевое слово (написание его внутри определения класса достаточно/единственно правильный путь).

Ваш кода имеет несколько других проблем (~Base() не определен, Concrete() ожидает параметр), но проблема вы спрашиваете решается простым удалением ошибочной virtual.

Смежные вопросы