2011-05-03 21 views
0

我正在使用某人不再使用的代碼,這是舊的CodeWarrior代碼。的XCode抱怨這一點:模板:我需要更好地學習這些內容嗎?爲什麼我會收到錯誤

template <class listClass,class itemClass> 
void FxStreamingObjectList<listClass,itemClass>::StreamOut(FxStream *stream) 
{ 
    if (listClass::size()) 
    { 
     stream->PutSeparator(); 
     stream->PutString(mFieldName.c_str()); 
     stream->PutSeparator(); 
     stream->PutBeginList(); 
     stream->Indent(+1); 

     listClass::iterator iter; 

     for (iter=listClass::begin(); iter != listClass::end(); iter++) 
     { 
      stream->PutSeparator(); 
      stream->PutString((*iter)->GetClassID()); 
     } 

      (*iter)->StreamOut(stream); 
     } 
     stream->Indent(-1); 
     stream->PutSeparator(); 
     stream->PutEndList(); 
     stream->PutSeparator(); 
} 

}

我得到listClass::iterator iter;for (iter=listClass::begin(); iter != listClass::end(); iter++)是錯誤的:

error: expected `;' before 'iter' 
error: 'iter' was not declared in this scope 

在同.H其它地方,相同類型的模板聲明中我得到的錯誤如:

error: dependent-name 'listClass::iterator' is parsed as a non-type, but instantiation yields a type 

at:

for (listClass::iterator iter=listClass::begin(); iter != listClass::end(); iter++)

我該如何解決這些錯誤?我不知道所有的模板,所以我很困惑,不知道從哪裏開始。一個很好的模板資源也很感激。

+0

可能重複[在哪裏,爲什麼我必須把「模板」,並在相關的名字「類型名稱」?( http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-template-and-typename-on-dependent-names) – 2011-05-03 17:05:34

+0

可能重複[何時應該使用關鍵字「typename」使用模板時](http://stackoverflow.com/questions/4227833/when-should-i-use-the-keyword-typename-when-using-templates) – 2011-05-03 17:05:40

+0

不重複。這個問題完全與這兩者相反! – 2011-05-03 17:08:05

回答

5

編譯器直到稍後在解析過程中才知道FxStreamingObjectList<listClass, itemClass>的任何特定實例的具體listClass具有稱爲iterator的成員類型。名稱iterator因此是「從屬名稱」。

You must hint到您所期望/需要iterator這裏是一個類型的編譯器,與typename關鍵字:

typename listClass::iterator iter; 

和:

for (typename listClass::iterator it = listClass::begin(), end = listClass::end(); it != end; ++it) 

(順便說一句,是begin()end()真的靜態會員功能?)

只是另一個C++的怪癖。 :)

+0

只要我40秒!壞壞。 +1 – Nawaz 2011-05-03 17:06:41

+0

@Nawaz:這是沒有理由刪除你的答案!雖然這是相當短暫的.. – 2011-05-03 17:07:41

+0

@Tomalak:我認爲你的更好,與你提供的解釋。所以我刪除了我的,因爲它不再需要。 – Nawaz 2011-05-03 17:10:18

1

正式C++不知道依賴符號是否是類型或否則。對你來說程序員listClass::iterator顯然是一種類型。編譯器需要一些幫助。

iter的定義應該是:

typename listClass::iterator iter 
1

其他的答案已經回答爲什麼錯誤
至於你的問題的第二部分:一個很好的模板資源也讚賞

C++模板最權威的書是:
C++模板:由大衛Vandevoorde &尼古拉約祖蒂斯完全指南

+0

謝謝,剛剛命令它。 – JTO 2011-05-03 17:21:11

+0

+1忘記了那一點。 – 2011-05-03 21:40:10

相關問題