简单嵌套类 我有一个关于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();}

简单嵌套类 我有一个关于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();},c++,c++11,C++,C++11,当我这样做时,我得到错误B没有命名类型。我认为解决方案是使用typedef class A::B_class;,但我还是犯了同样的错误 谢谢大家! 您需要更改几件事:向函数定义中添加paren,使用封闭类a::以及所需的typename限定外部B,因为类型取决于a的类型,并更改返回到实际对象创建 此处,在固定来源中列出: template<class T> typename A<T>::B A<T>::getB() {return B();} //^-----

当我这样做时,我得到错误B没有命名类型。我认为解决方案是使用typedef class A::B_class;,但我还是犯了同样的错误


谢谢大家!

您需要更改几件事:向函数定义中添加paren,使用封闭类a::以及所需的typename限定外部B,因为类型取决于a的类型,并更改返回到实际对象创建

此处,在固定来源中列出:

template<class T>
typename A<T>::B A<T>::getB() {return B();}
//^----------------------------------------------typename
//       ^---------------------------------------qualification
//                         ^---------------------parens
//                                     ^---------c-tor call
A是模板的名称,因此A是实例化类的名称

因此,嵌套类的全名是A::B,但由于B依赖于模板参数T并且是一个类型,因此必须指定模板A::B

棘手的一点是,在A的声明中,只需使用B名称就可以引用B。您可以通过使用,使用所谓的注入类名来引用的实例化。因此,在类声明中,可以同时引用模板和类实例化

回答你的问题:

template<class T>
typename A<T>::B A<T>::getB()
{
    B b;
    return b;
}

请注意,返回类型在函数声明之外,因此需要使用完全限定名。

注释之外的描述可能会有用。你为什么在getB的结尾指出帕伦夫妇?你所说的限定是什么意思?@Yakk,因为原始函数缺少它们?作为第一步,尝试在模板类之外进行此操作。实际上,我更喜欢这个版本。可以简化的一件事是返回{};,但我想这是一种风格上的选择。是的,我发现过度使用尾部返回类型有点冗长,但在这种情况下非常好。这里完全不需要将对象创建与返回分离。
template<class T>
auto A<T>::getB() -> B { return B{}; }
template<class T>
typename A<T>::B A<T>::getB()
{
    B b;
    return b;
}