如何从封闭模板类访问嵌套类的方法和字段?

1 c++ templates nested friend-class

我在网上搜索过没有找到任何解释为什么会发生以下情况.

例如,有一个模板类Enclosing与嵌套类嵌套.

在Enclosing类中,有一个方法应该创建Nested类的实例并使用它的字段和方法.

在下面的代码中,有一个模型,我正在尝试这样做:

template<typename T, typename S>
class Enclosing{
public:
    class Nested;
    Nested foo();
};

template<typename T, typename S>
class Enclosing<T,S>::Nested{
public:
    T field;
    void some_method();
    friend class Enclosing;    // instead of this line I also tried:
                               // friend class Enclosing<T,S> 
                               // and it didn't work either
};

template<typename T, typename S>
typename Enclosing<T,S>::Nested Enclosing<T,S>::foo (){
    Nested nes;
    nes.some_method;         // the problem appears here
    return enc;
}
Run Code Online (Sandbox Code Playgroud)

问题是:

当我写作时nes.some_method,在我输入"nes."之后,我尝试过的任何环境(VS2010,eclipse)都没有提出任何选择.我觉得"nes"根本不是班上的一个例子.

如何从封闭模板类访问嵌套类的方法和字段?

And*_*owl 5

这一行:

Nested nes();
Run Code Online (Sandbox Code Playgroud)

不创建类型的对象nes,而是声明一个不带参数的函数并返回一个类型的对象Nested.我怀疑这是你问题的根源,而不是friend宣言.只需删除以下括号后的括号nes:

Nested nes;
Run Code Online (Sandbox Code Playgroud)

或者,在C++ 11中,您可以:

Nested nes{};
Run Code Online (Sandbox Code Playgroud)

编辑:

修复上述错误后,似乎您的程序仍无法正确编译和链接 - 怀疑是因为同样的问题.我从您的代码中可以看出,some_method()成员函数的定义仍然缺失,这可能是链接器拒绝为您的程序创建可执行文件的原因.