爲什麼下面的代碼給我一個錯誤(g ++ 4.1.2)?帶有typedef返回值的模板成員函數
template<class A>
class Foo {
public:
typedef std::vector<A> AVec;
AVec* foo();
};
template<class A>
Foo<A>::AVec* Foo<A>::foo() { // error on this line
return NULL;
}
的錯誤是:
error: expected constructor, destructor, or type conversion before '*' token
我怎麼到(用正確的返回類型),否則定義Foo<A>::foo()
功能?
您的解決方案是正確的,但我不太確定解釋。只要編譯器達到'Foo :: foo',它將返回並「修復」返回類型。如果它沒有這樣做,它將不符合'foo'(在類中)與定義的聲明(即它會警告返回類型不同)。這與您的鏈接中的「兩階段」查找無關。 – 2009-05-27 17:59:25
我相信我錯在了兩階段的查找鏈接中。正確的解釋是 - 當查找嵌套的依賴名稱(依賴未知模板參數,即Foo :: Bar)時,它被假定爲不是類型。唯一的例外是在基類列表中。 至於編譯器修復返回類型 - 否,模板實例化發生得更晚;編譯器在代碼 – ASk 2009-05-28 00:00:06