返回inclass结构

Rob*_*n92 2 c++ templates class

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

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

    public:
    /* omitting irrelevant parts */
    SFoo* get();
};
Run Code Online (Sandbox Code Playgroud)

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

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

错误: <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
Run Code Online (Sandbox Code Playgroud)

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

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

Pub*_*bby 5

您必须使用限定依赖类型typename.看看我在哪里以及为什么要放置"template"和"typename"关键字?

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

在C++ 11中,您可以使用,auto因为SFoo它将在函数名之后的范围内

template <typename T>
auto CFoo<T>::get() -> SFoo* { return foo; }
Run Code Online (Sandbox Code Playgroud)