C++模板类的内部类如何定义?模板类B中A::InnerA报错如何解决
错误原因
在模板类B<T>的上下文里,A<T>是依赖模板参数T的待决类型,它的内部嵌套类InnerA属于待决名。按照C++语法规则,没有显式标识的待决名会被编译器默认判定为非类型成员(成员变量、成员函数等),因此你直接写A<T>::InnerA时,编译器不会把它识别为类型,才会抛出「A::InnerA is not a type」的错误。
C++14 auto写法的本质
你在C++14标准下用auto声明参数,本质是触发了隐式函数模板推导:相当于自动把Fb变成了如下的模板函数:
template <typename U> void Fb(U i) { _a.Fa(i); }
编译器会在Fb被调用时自动推导参数i的实际类型为A<T>::InnerA*,绕开了显式声明依赖类型的要求,所以能编译通过,此时参数的真实类型就是你原本想要的A<T>::InnerA*。
正确的类型定义方式
只需要在待决类型前加上typename关键字,显式告知编译器这个名字是一个类型即可,修改后的B类代码如下:
template <typename T> class B { public: // 加typename显式声明A<T>::InnerA是类型 void Fb(typename A<T>::InnerA* i) { _a.Fa(i); } private: A<T> _a; };
这种写法兼容所有C++标准,比auto的写法更明确,也不会产生额外的模板开销。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

