2012-07-03 49 views
1

可能重複:
Where and why do I have to put the 「template」 and 「typename」 keywords?
c++ template typename iterator聲明一個C++設置迭代

下面的代碼不會編譯:

#include <iostream> 
#include <set> 
using namespace std; 

template<class T> 
void printSet(set<T> s){ 
    set<T>::iterator it; 
} 

int main(int argc, char** argv){ 
    set<int> s; 
    printSet<int>(s); 
    return 0; 
} 

我得到一個錯誤說:

set.cpp: In function ‘void printSet(std::set<T, std::less<_Key>, std::allocator<_CharT> >)’: 
set.cpp:7: error: expected `;' before ‘it’ 
set.cpp: In function ‘void printSet(std::set<T, std::less<_Key>, std::allocator<_CharT> >) [with T = int]’: 
set.cpp:12: instantiated from here 
set.cpp:7: error: dependent-name ‘std::set<T,std::less<_Key>,std::allocator<_CharT> >::iterator’ is parsed as a non-type, but instantiation yields a type 
set.cpp:7: note: say ‘typename std::set<T,std::less<_Key>,std::allocator<_CharT> >::iterator’ if a type is meant 

我做錯了什麼?我覺得我幾乎沒有寫任何東西,並且C++已經給了我這個可怕的消息。

如果它有幫助,它看起來像是,如果我用迭代器註釋掉這一行,就沒有錯誤。然而,到目前爲止我在網上看到的所有例子似乎都是這樣聲明迭代器的。我認爲。

+3

非常仔細地閱讀錯誤消息的最後兩行。 –

回答

8

普瑞你的宣言用關鍵字typename,正是如此:

typename set<T>::iterator it; 

你需要時,你是指一個類型,它是依賴於一個模板參數來做到這一點。在這種情況下,iterator依賴於T.否則,編譯器難以找出iterator是什麼,無論是類型還是靜態成員或其他。 (當然,從技術上講,它並沒有試圖搞清楚,它的決定已經做出,這恰好是錯誤的)

注意,如果你有一個具體的類型,例如:

set<int>::iterator it; 

typename沒有必要。

+0

嗯...爲什麼需要typename? – Mehrdad

+0

謝謝!有用!但它似乎有點像黑魔法。到底什麼時候我知道我需要放置一個'typename'? – math4tots

+0

@ math4tots:新增說明。 –