2012-12-22 160 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.