2012-01-27 4 views
0

получить пару ошибок, что это виртуальная функция с не виртуальным деструктором. как я могу исправить эту ошибку? он работал в g ++ 4.6.x, но мне нужно, чтобы он работал с более старой версией g ++. :(виртуальный деструктор?

#include <list> 

template <typename T> 
class container{ 
public: 
    ~queue(){ 
     queuel.clear(); 
     queuel.~list(); 
    } 
    virtual T func_x(){ 
     T temp; 
     //do stuff with list<t> test 
     return temp; 
    } 
private: 
    std::list<T> test; 
}; 

template <typename T> 
class container2 : public container<T>{ 
public: 
    virtual T func_x(){ 
     T temp; 
     //do different stuff with list<T> test 
     return temp; 
    } 
}; 
+1

woah - можете ли вы исправить образец кода? Вы определяете '~ queue' внутри' container <> 'и почему вы вызываете деструктор явно? – sehe

+0

Если вы хотите получить хороший ответ, я рекомендую опубликовать код, который компилируется. Кроме того, вы не можете вызвать деструкторы, как вы это делали, с '' queuel. ~ List(); '' – grundprinzip

+1

@grundprinzip: Да, вы * можете * вызывать деструктор явно, хотя, вероятно, нет причин для этого. –

ответ

4

Edit: @Als имеет точку, деструктор также ошибочно названные по имени своего класса Обновленного ответ

Проблема заключается в том, что только г ++ считает, что, поскольку у вас есть виртуальные методы в классе.. , вы должны иметь виртуальный деструктор. Это связано с тем, что если вы наследуете класс и расширяете его, вы можете выделить память или другие ресурсы, которые деструктор базового класса не имеет понятия об очистке, и если ваш деструктор не является виртуальным, деструктор базового класса может быть вызван в некоторых случаях вместо вашего реального деструктора.

Правило большого пальца есть, i f у вас есть виртуальные методы в вашем классе, используйте виртуальный деструктор. Удаление неправильно имени деструктор ~ очереди и ввод

virtual ~container(); 

в вашем объявлении класса и impementing деструктора в файле .cpp должно решить вашу проблему.

+0

Как правило, достаточно просто положить 'virtual ~ Queue() {}' в класс. Базовые классы обычно не имеют каких-либо элементов данных, и на практике деструктор базового класса будет вызываться только из деструкторов производного класса (поэтому работает встраивание). –

+1

@LucTouraille В этом отношении, с точки зрения дизайна, класс не выглядит так, как будто он должен иметь любые виртуальные функции :-). –

+0

@JoachimIsaksson Хорошее объяснение, за исключением того, что я смущен одной точкой. Вы имели в виду, что «деструктор базового класса» можно назвать «в конце вашего ответа? – Zak

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

  • Нет связанных вопросов^_^