简单的嵌套类

Simple nested class

本文关键字:嵌套 简单      更新时间:2023-10-16

我有一个关于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();}

当我这样做时,我得到错误"B没有命名类型"。我相信解决方案是使用typedef class A<T>::B b_class;,但我仍然以同样的错误结束。

谢谢!

您需要更改一些东西:在函数定义中添加父类,用封闭类(A<T>::)和typename一起限定外部B(需要,因为类型取决于a的类型),并更改返回到实际对象创建。

在这里,在固定源中列出:

template<class T>
typename A<T>::B A<T>::getB() {return B();}
//^----------------------------------------------typename
//       ^---------------------------------------qualification
//                         ^---------------------parens
//                                     ^---------c-tor call
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{}; }

A是模板的名称,因此A<T>是(实例化的)类的名称。

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

棘手的是,在A的声明中,您可以通过使用B名称来引用B。您可以通过使用A来引用A<T>的实例化,使用所谓的注入类名。因此,在类声明内部,A既可以引用模板,也可以引用类的实例化。

回答你的问题:

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

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