我在网上搜索过没有找到解释为何会发生以下情况的原因。
例如,有一个模板类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;根本不是班上的一个例子。
如何从封闭模板类访问嵌套类的方法和字段?
答案 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。