1 c++ templates nested friend-class
我在网上搜索过没有找到任何解释为什么会发生以下情况.
例如,有一个模板类Enclosing与嵌套类嵌套.
在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;
}
Run Code Online (Sandbox Code Playgroud)
问题是:
当我写作时nes.some_method,在我输入"nes."之后,我尝试过的任何环境(VS2010,eclipse)都没有提出任何选择.我觉得"nes"根本不是班上的一个例子.
如何从封闭模板类访问嵌套类的方法和字段?
这一行:
Nested nes();
Run Code Online (Sandbox Code Playgroud)
不创建类型的对象nes,而是声明一个不带参数的函数并返回一个类型的对象Nested.我怀疑这是你问题的根源,而不是friend宣言.只需删除以下括号后的括号nes:
Nested nes;
Run Code Online (Sandbox Code Playgroud)
或者,在C++ 11中,您可以:
Nested nes{};
Run Code Online (Sandbox Code Playgroud)
编辑:
修复上述错误后,似乎您的程序仍无法正确编译和链接 - 怀疑是因为同样的问题.我从您的代码中可以看出,some_method()成员函数的定义仍然缺失,这可能是链接器拒绝为您的程序创建可执行文件的原因.