返回inclass结构

时间:2012-12-22 11:47:35

标签: c++ class templates

我有一个具有以下结构的模板类

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

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

现在,如果我在头文件中实现方法 SFoo * get(),一切都很好。但是,如果我将声明和定义分开,我的代码将停止使用以下编译错误。

//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

我期待着有关如何解决这个问题的任何提示。提前谢谢。

3 个答案:

答案 0 :(得分: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; }

答案 1 :(得分:1)

在课堂声明之外,您需要完全符合SFoo的条件:typename CFoo<T>::SFoo

答案 2 :(得分:1)

通常,只要依赖于模板参数的名称是类型,就必须使用typename

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

§14.6.2名称解析

  

模板声明或定义中使用的名称,即   取决于模板参数,假定不命名类型,除非   适用的名称查找查找类型名称或名称是合格的   通过关键字typename。