我已经在网上搜索过,却找不到任何解释说明为什么发生以下情况。

例如,有一个包含嵌套类Nested的模板类。

在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;
}

问题是:

当我编写nes.some_method时,在键入“nes。”之后,我尝试过的所有环境(VS2010,eclipse)都没有为我提供任何选项。我似乎“nes”根本不是该类的实例。

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

最佳答案

这行:

Nested nes();

不创建nes类型的对象,而是声明一个不带任何参数并返回Nested类型的对象的函数。我怀疑这是您问题的根源,而不是friend声明。只需删除nes之后的一对括号即可:
Nested nes;

或者,在C++ 11中,您可以执行以下操作:
Nested nes{};

编辑:

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

09-08 09:35