2012-12-22 34 views
2

我有一個模板類結構如下返回inclass結構

//CFoo.hpp (header file) 
template <typename T> 
class CFoo { 
     struct SFoo { 
      T *ptr; 
      /* rest is irrelevant */ 
     } *foo; 

    public: 
    /* omitting irrelevant parts */ 
    SFoo* get(); 
}; 

現在,如果我實現的方法SFoo *獲得()內部文件頭一切正常漂亮。但是,如果我單獨聲明和定義,我的代碼將停止處理以下的編譯錯誤。

//CFoo.cpp (source code, example 1) 
/* omitting irrelevant parts */ 
template <typename T> 
SFoo* CFoo<T>::get() { return foo; } //ERROR HERE 

錯誤:<where-is-the-error>: error: ‘SFoo’ does not name a type

//CFoo.cpp (source code, example 2) 
/* omitting irrelevant parts */ 
template <typename T> 
CFoo<T>::SFoo* CFoo<T>::get() { return foo; } //ERROR HERE 

錯誤:<where-is-the-error>: error: need ‘typename’ before ‘CFoo<T>::SFoo’ because ‘CFoo<T>’ is a dependent scope

我期待着就如何解決這個問題的任何提示。提前致謝。

+1

你試圖把在'typename'作爲最後的錯誤提示? – Timbo

+0

@Timbo在哪裏放這個關鍵字?我想我說得對。 – Robin92

回答

5

您必須使用typename來限定相關類型。見Where and why do I have to put the "template" and "typename" keywords?

//CFoo.cpp (source code, example 2) 
/* omitting irrelevant parts */ 
template <typename T> 
typename CFoo<T>::SFoo* CFoo<T>::get() { return foo; } 
^^^^^^^^ 

在C++ 11可以在函數名後使用auto而不是因爲SFoo將在規模

template <typename T> 
auto CFoo<T>::get() -> SFoo* { return foo; } 
+0

現在所有的C++需要做的是用關鍵字'function'和'var'來替換'auto',並且我們有一個體面的語言。 'var x = 1;'...'function foo() - > int {return 42; }' –

1

您需要完全限定SFoo當類聲明之外:typename CFoo<T>::SFoo

1

一般而言,只要依賴模板參數的名稱是類型,就必須使用typename

template <typename T> 
typename CFoo<T>::SFoo* CFoo<T>::get() { return foo; } 

§14.6.2名稱解析

A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.