2015-10-14 98 views
4

我有一個內部類myIterator,我的模板類linearLinkedList<T>,我想從simpleIterator<T>覆蓋繼承的虛擬方法,但編譯器拒絕它們爲「模板可能不是虛擬的」。不過,根據this question,似乎這應該是可能的,因爲它只取決於班級的類型。例如下面我的代碼中的方法foo是合法的。我如何實現內部類的虛函數?如何在模板類的內部類中寫入虛函數?

template <class T> 
class linearLinkedList 
{ 
public: 
... 
virtual void foo(T data); //OK 
simpleIterator<T> * iterator(); 
private: 
... 
class myIterator : public simpleIterator<T> 
{ 
    public: 
    myIterator(node<T> ** head); 
    virtual ~myIterator(); //inherited from simpleIterator; error when implemented 
    private: 
    node<T> ** prev; 
    node<T> ** next; 
    //functions inherited from simpleIterator<T>: 
    virtual bool hasNext_impl(); //error when implemented 
    virtual T next_impl(); 
    virtual void remove_impl(); 
}; 
... 
template<class T> 
virtual linearLinkedList<T>::myIterator::~myIterator() { ... } 
-> 
linearLinkedList.h:213:1: error: templates may not be âvirtualâ 
virtual linearLinkedList<T>::myIterator::~myIterator() 
+1

不要把'virtual'關鍵字外的類的定義 –

+1

你必須不要在類定義之外使用virtual關鍵字。 – MikeMB

+1

@PiotrSkotnicki哦,傻我。想要做出答案,以便我可以接受它? – Vitruvius

回答

3

甲成員函數不是函數模板本身可以被標記爲virtual,即使它然而類模板的一部分,:

§7.1.2 [dcl.fct.spec]/p1:

函數說明符只能在函數聲明中使用。

function-specifier: 
    inline 
    virtual 
    explicit 

virtual符應當是僅在初始宣佈非靜態類的成員函數的使用;見10.3。

也就是說,你應該從外的類定義中刪除virtual關鍵字:

template<class T> 
virtual linearLinkedList<T>::myIterator::~myIterator() { ... } 
~~~~~~^ to be removed 
相關問題