2015-11-11 39 views
1

這是我的List類C++模板函數錯誤:變量或字段 'swapAdjacent' 宣佈無效

template <typename Object> 
class List { 
    public: 
     class iterator { 
      ... 
     }; 
    .... 
}; 

這是我的功能

template <typename Object> 
void swapAdjacent(List<Object>::iterator & itrA, List<Object>::iterator & itrB) { 

} 

編譯之後,原來以下錯誤

error: variable or field 'swapAdjacent' declared void

爲什麼它不能工作?

如果我我的代碼更改爲以下,也可以是工作

void swapAdjacent(List<int>::iterator & itrA, List<int>::iterator & itrB) { 

} 

我需要幫助;爲什麼第一個功能不能工作?

+0

我編譯罰款。什麼是你的編譯器,你怎麼調用swapAdjacent()? –

+0

編譯器: g ++(i686-posix-dwarf-rev0,由MinGW-W64項目構建)5.2.0 我還沒有調用該函數。 編譯時發生錯誤。 – semsevens

回答

5

這似乎是一個奇怪的編譯器錯誤,但它看起來像你的問題是,你需要告訴編譯器,從屬名稱List<Object>::iterator命名一個類型。你這樣做使用typename關鍵字:

template <typename Object> 
void swapAdjacent(typename List<Object>::iterator & itrA, 
        typename List<Object>::iterator & itrB) { 

} 

有關typename關鍵字的更多信息,請參見this question

爲了簡便起見,你可以只使用迭代器作爲模板參數,它會爲你贏得自動扣除,以及:

template <typename Iterator> 
void swapAdjacent(Iterator & itrA, Iterator & itrB) { 

} 
+0

同樣將模板更改爲也應該起作用 – Netwave

+0

@DanielSanchez沒有什麼區別;除非我們正在討論pre-C++ 17中的模板模板參數,'class'與'typename'是純粹的文體選擇。 – TartanLlama

+0

然後,因爲列表本身就是一個你不需要添加typename的模板,所以我現在不能嘗試,但我認爲在模板中使用typename迫使它分佈在定義 – Netwave