我已经在网上搜索过,却找不到任何解释说明为什么发生以下情况。
例如,有一个包含嵌套类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()
成员函数的定义,这可能是链接程序拒绝为您的程序创建可执行文件的原因。