變化:
MyList::iterator it;
到:
typename MyList::iterator it;
我相信這有做不被肯定爲MyList::iterator
是否應該是某種類型的值,編譯器(比如說iterator
是MyList
的靜態成員)或類型。 typename
強制後者(正確)選項。
我相信從這裏開始相關標準的引用,第二個14.6:
在模板中使用的名字,假設除非適用的名稱查找發現一個類型名稱或名稱由合格未命名類型關鍵字typename
。
所以,你必須弄清楚什麼是「適用名稱查找」是的,但標準也與此示例跟進:
// no B declared here
class X;
template<class T> class Y {
class Z; // forward declaration of member class
void f() {
X* a1; // declare pointer to X
T* a2; // declare pointer to T
Y* a3; // declare pointer to Y<T>
Z* a4; // declare pointer to Z
typedef typename T::A TA;
TA* a5; // declare pointer to T’s A
typename T::A* a6; // declare pointer to T’s A
T::A* a7; // T::A is not a type name:
// multiply T::A by a7
B* a8; // B is not a type name:
// multiply B by a8; ill-formed,
// no visible declaration of B
}
};
是的,你失去了一些東西重要:告訴我們的編譯器錯誤是什麼。 :) – 2010-10-26 14:35:38
@Steve:不,編譯器無關緊要,只是g ++錯誤地接受了代碼。 – 2010-10-26 14:43:43
是的,對不起'回合。編輯。 – 2010-10-26 14:49:11