2010-02-11 37 views
1

提供的代碼如下:C++/templates/GCC 4.0 bug?

template<class _ResClass, class _ResLoader=DefaultLoader> 
class Resource 
: public BaseResource 
{ 
private: 
    _ResClass data_; 

public: 
    explicit Resource(const std::string& path) 
    : data_(_ResLoader::load<_ResClass>(path)) 
    { }; 
}; 

它爲什麼會失敗,但這個一會工夫?:

template<class _ResClass, class _ResLoader=DefaultLoader> 
class Resource 
: public BaseResource 
{ 
private: 
    _ResClass data_; 

public: 
    explicit Resource(const std::string& path) 
    : data_(**DefaultLoader**::load<_ResClass>(path)) 
    { }; 
}; 
+3

不是答案,但像_ResLoader這樣以下劃線和大寫字母開頭的名稱在C++中保留 - 您不能在自己的代碼中創建這樣的名稱。 – 2010-02-11 15:15:04

+0

什麼是錯誤信息? – 2010-02-11 15:16:54

+0

什麼是'DefaultLoader :: load'?它是模板成員函數嗎?內部類型的'DefaultLoader'? – 2010-02-11 15:23:40

回答

7

負載是一個從屬名稱,所以

data_(_ResLoader::template load<_ResClass>(path)) 

出於同樣的原因作爲typename當從屬名稱是一種類型是必要的。

+0

你搖滾。謝謝! – 2010-02-11 15:38:45

4

你需要做_ResLoader::template load<_ResClass>(path)而不是_ResLoader::load<_ResClass>(path)

訪問使用模板參數嵌套的模板時,需要使用template關鍵字(對於嵌套在模板參數中的類型,您需要使用typename關鍵字的相同方式)。

+0

謝謝!你的答案也是值得的! – 2010-02-11 15:39:11