2009-05-24 59 views
9

爲什麼下面的代碼給我一個錯誤(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()功能?

回答

17

這是一個叫做「two-stage lookup」的問題。基本上,因爲Afoo()的定義中的模板參數,所以編譯器無法知道第一次解析模板的時間,Foo<A>::AVec是一種類型還是存在的(例如,因爲可能存在Foo<Bar>的專業化它根本不包含typedef)。它只會知道在模板實例化期間發生了什麼,後面會發生 - 這個階段已經太晚了。

正確的方法是使用typename關鍵字來表明這是一個類型:

template<class A> 
class Foo { 
public: 
    typedef std::vector<A> AVec; 
    AVec* foo(); 
}; 

template<class A> 
typename Foo<A>::AVec* Foo<A>::foo() { 
    return NULL; 
} 
-1

我真的不知道,但可以嘗試在類之外放置typedef。

13

通常typename問題:

template<class A> 
typename Foo<A>::AVec* Foo<A>::foo() { // error on this line 
    return NULL; 
} 

記住:作爲一般規則,全部合格取決於模板參數的名稱在它們之前需要typename