2010-09-17 48 views
6

我想寫一個函數來打印常見STL容器(向量,列表等)的表示形式。我給了函數一個模板參數T,例如,它可能表示向量。我有越來越型T.T :: iterator錯誤,其中模板參數T可能是矢量<int>或列表<int>

vector<int> v(10, 0); 
repr< vector<int> >(v); 

的迭代器的問題...

template <typename T> 
void repr(const T & v) 
{ 
    cout << "["; 
    if (!v.empty()) 
    { 
     cout << ' '; 
     T::iterator i; 
     for (i = v.begin(); 
      i != v.end()-1; 
      ++i) 
     { 
      cout << *i << ", "; 
     } 
     cout << *(++i) << ' '; 
    } 
    cout << "]\n"; 
} 

...

[email protected]:~/Desktop/stl$ g++ -Wall main.cpp 
main.cpp: In function ‘void repr(const T&)’: 
main.cpp:13: error: expected ‘;’ before ‘i’ 
main.cpp:14: error: ‘i’ was not declared in this scope 
main.cpp: In function ‘void repr(const T&) [with T = std::vector<int, std::allocator<int> >]’: 
main.cpp:33: instantiated from here 
main.cpp:13: error: dependent-name ‘T::iterator’ is parsed as a non-type, but instantiation yields a type 
main.cpp:13: note: say ‘typename T::iterator’ if a type is meant 

我嘗試 'typename的T ::迭代器' 爲編譯器建議,但只會得到一個更加神祕的錯誤。

編輯:謝謝你們的幫助!下面是一個人工作版本誰想要使用此功能:

template <typename T> 
void repr(const T & v) 
{ 
    cout << "["; 
    if (!v.empty()) 
    { 
     cout << ' '; 
     typename T::const_iterator i; 
     for (i = v.begin(); 
      i != v.end(); 
      ++i) 
     { 
      if (i != v.begin()) 
      { 
       cout << ", "; 
      } 
      cout << *i; 
     } 
     cout << ' '; 
    } 
    cout << "]\n"; 
} 
+0

如何發佈「更神祕」的錯誤信息呢? – 2010-09-17 11:53:07

+4

順便說一句,你可能想用其他非RandomAccess迭代器支持的東西替換v.end()-1。 – sellibitze 2010-09-17 12:02:56

回答

18

您需要typename告訴::iterator應該是一個類型的編譯器。編譯器不知道它是一個類型,因爲它不知道T是什麼,直到你實例化模板。例如,它也可以引用一些靜態數據成員。這是你的第一個錯誤。

您的第二個錯誤是v是一個參考-const。所以,而不是::iterator你必須使用::const_iterator。你不能要求一個常量容器作爲非const迭代器。

+0

誰回答了這個問題?答案是正確的。 – 2010-09-17 12:15:25

+0

與編譯器不知道什麼是':: iterator'不同,但標準要求它將其解釋爲非類型,因爲它很好地放在錯誤消息中:「dependent-name''T :: iterator''被解析爲一個非類型,但是實例化會產生一個類型「 – visitor 2010-09-17 12:16:00

+2

」,我明白了。所以,這種頭髮分裂證明了一個downvote。 – sellibitze 2010-09-17 12:23:05

3

變化T::iterator i;typename T::const_iterator i;因爲::iteratorT型和vconst &

在符合要求的相關類型之前,您需要typename。 沒有typename,有一個C++語法分析規則,說明限定的相關名稱應該被解析爲non-types,即使它會導致語法錯誤。

typename指出下面的名稱應該被視爲一種類型。否則,名稱被解釋爲指代非類型。

相關問題