1

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

例如,有一个模板类 Enclosure 与一个嵌套类 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”根本不是班级的一个实例。

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

4

2 回答 2

5

这一行:

Nested nes();

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

Nested nes;

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

Nested nes{};

编辑:

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

于 2013-05-10T15:38:35.177 回答
0

这里:

Nested nes();

您没有调用默认构造函数,Nested而是声明了一个名为的函数,该函数nes接受 0 个参数并按值返回该类的实例Nested。这被称为最令人烦恼的 Parse。删除参数以使代码正常运行。

这是一个工作演示

于 2013-05-10T15:41:28.193 回答