简单的嵌套类

时间:2015-09-23 13:46:18

标签: c++ c++11

我有一个关于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;,但我仍然会遇到同样的错误。

谢谢!

3 个答案:

答案 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;
}

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