2014-06-10 123 views
3

我已經定義爲:一類如下:模板類方法聲明失敗

template <typename T> class list 
{ 
    private: 
    struct node 
    { 
    T val; 
    node *next; 
    } *origin; 

    node* iterate(node *first,node *last); 

    (...) code  
}; 

隨着它在這裏定義的函數方法:

template <typename T> 
node* list<T>::iterate(node *first,node *last) 
{ 
    while(first->next!=last) 
    { 
    first = first->next; 
    } 
    return first; 
} 

由於類是使用模板功能,一切都寫在標題中。

的問題是,當我嘗試編譯它給了我這些錯誤:

error C2143: syntax error : missing ';' before '*' 
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
error C2065: 'T' : undeclared identifier 
error C2923: 'list' : 'T' is not a valid template type argument for parameter 'T' 

所有這4個錯誤表明在這一行:

template <typename T> 
node* list<T>::iterate(node *first,node *last) 

在所有情況下的函數被調用這從類中的方法:

node* aux = iterate(origin,origin); 


這裏有什麼問題嗎?爲什麼它不起作用?

回答

3

list類模板的定義之外,node不是已知類型。因此,必須爲返回類型指定顯式範圍。它不需要參數類型,因爲那個時候範圍已知爲list<T>

使用

template <typename T> 
typename list<T>::node* list<T>::iterate(node *first,node *last) 
{ 
    while(first->next!=last) 
    { 
    first = first->next; 
    } 
    return first; 
} 
+0

@quandev,感謝編輯:) –

+0

@R薩胡,謝謝,它的工作。 –

+0

@RobertEagle,不客氣。 –

2

當編譯器看到node *就行了:

node* list<T>::iterate(node *first,node *last) 

它不知道你在說什麼:因爲它無法理解的第一個標記,然後它並沒有意識到這應該是在list<T>的背景下查找的一個類型名稱。

在C++ 03的解決方法是手動指定的範圍(與事實,即它是一個類型名稱,因爲它是一個從屬名稱):

typename list<T>::node* list<T>::iterate(node *first,node *last) 

在C++ 11新的語法的溶液中加入爲了避免這個問題,這裏的返回類型來算賬,使不合格的名稱查找可以正常發生:

auto list<T>::iterate(node *first,node *last) -> node* 
{ 
    // ...