2013-08-26 17 views
2

我一直在爲CList寫一個循環列表的自定義類。我一直把它作爲一個家庭作業的基礎,我很久以前完成了大量的複製粘貼,所以我不完全記得我一直在寫作的所有東西。不合格的ID和模板類

反正無非是想包括.h文件使我在使用空間std行錯誤:

main.cpp:11: error: expected unqualified-id before ';' token 

除了兩個錯誤指着我的代碼功能:

In file included from main.cpp:9: 
CList.h:119: error: non-template 'CIterator' used as template 
CList.h:119: note: use 'CList<T>::template CIterator' to indicate that it is a template 

這是有問題的功能:

template <class T> 
typename CList<T>::CIterator<T> CList<T>::push(T const& v) 
{ 
    size++; 
    Node<T>* p = new Node<T>(v); 

    if (this -> size_ == 1) 
    { 
     head = p; 
     tail = p; 
     p -> next = p; 
     p -> prev = p; 
    } 
    else 
    { 
     tail -> next = p; 
     p -> next = head; 
     p -> prev = tail; 
     head -> prev = p; 
     tail = p; 
    } 

    return CIterator(p); 
} 

我真的不明白這裏的錯誤是。我告訴函數返回一個CList的CIterator,並表示這個函數是CList類的一部分。這就是我的理解,當我讀到行

typename CList<T>::CIterator<T> CList<T>::push(T const& v) 

爲什麼會認爲CIterator是模板時顯然T是模板?我只是困惑。

回答

1

錯誤消息指出CIterator<T>不被視爲模板。這是因爲它是一個依賴名稱,編譯器只能在實例化時確實確定它確實是一個嵌套模板。該問題的解決方法是告訴編譯器,它實際上是一個模板:

template <class T> 
typename CList<T>::template CIterator<T> CList<T>::push(T const& v) 
{ 
    ... 
} 

編譯器不知道是否CList<T>::CIterator<T>是模板的原因是該類CList<X>可以專門用於某種類型X到裏面沒有嵌套模板。但是,編譯器僅在實例化模板時才發現有關這些特化。