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

时间:2013-05-10 15:36:20

标签: c++ templates nested friend-class

我在网上搜索过没有找到解释为何会发生以下情况的原因。

例如,有一个模板类Enclosing with a nest class 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时,我输入的环境(VS2010,eclipse)都没有,在我输入&#34; nes。&#34;之后,并没有向我提出任何建议选项。我似乎&#34; nes&#34;根本不是班上的一个例子。

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

2 个答案:

答案 0 :(得分:5)

这一行:

Nested nes();

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

Nested nes;

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

Nested nes{};

修改

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

答案 1 :(得分:0)

下面:

Nested nes();

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

这是一个有效的demo