我有一个关于c ++中嵌套类的初学者问题。互联网上有很多关于此的信息,但我仍然无法在没有编译错误的情况下正常工作。我只想从类A中的函数返回内部类B.
template<class T>
class A
{
public:
A();
class B
{
public:
B(){};
};
B getB();
};
template<class T>
A<T>::A(){}
template<class T>
B A<T>::getB{return B();}
当我这样做时,我得到错误&#34; B没有命名类型&#34;。我相信解决方案是使用typedef class A<T>::B b_class;
,但我仍然会遇到同样的错误。
谢谢!
答案 0 :(得分:2)
您需要更改一些内容:在函数定义中添加parens,使用封闭类(B
)与A<T>::
一起限定外部typename
(必需因为类型取决于关于A)的类型并将返回更改为实际对象创建。
此处列出固定来源:
template<class T>
typename A<T>::B A<T>::getB() {return B();}
//^----------------------------------------------typename
// ^---------------------------------------qualification
// ^---------------------parens
// ^---------c-tor call
答案 1 :(得分:1)
template<class T>
B A<T>::getB{return B b;}
这里有三个问题:
B
未将类型命名为A<T>::B
。您需要明确它,使用typename A<T>::B
或使用尾随返回类型,以便B
引用正确的名称。
在()
getB
您创建临时B
的语法不正确,应为B()
或B{}
这是一个固定版本:
template<class T>
auto A<T>::getB() -> B { return B{}; }
答案 2 :(得分:1)
A
是模板的名称,因此A<T>
是(实例化)类的名称。
因此,嵌套类的全名是A<T>::B
,但由于B
取决于模板参数T
并且是类型,因此您必须指定template A<T>::B
。
棘手的一点是,在A
声明中,您只需使用B
名称即可引用B
。您可以使用{em>注入的类名,使用A<T>
来引用A
的实例化。因此,在类声明中,A
可以引用模板和类实例化。
回答你的问题:
template<class T>
typename A<T>::B A<T>::getB()
{
B b;
return b;
}
请注意,返回类型在函数声明之外,因此您需要使用完全限定名称。