如何从派生模板类访问基类中定义的模板类型?
问题:在模板派生类中访问基类的模板内部类型
我想要从派生模板类SubClass中访问基类的模板内部类型InsideType,但在Visual Studio 2022 C++20环境下编译出错,代码如下:
// 这里可以有更多类型的基类,它们都定义了`InsideType`。 struct BaseClass { template <class T> struct InsideType { }; }; // 子类可以继承一种基类。 template <class Base> struct SubClass : public Base { // Visual Studio 2022 C++20下编译错误: // error C2059: 语法错误: '<' // error C2238: 在';'之前有意外的标记 typename Base::InsideType<int> val; }; int main() { SubClass<BaseClass> var; return 0; }
编译错误信息:
// error C2059: syntax error: '<' // error C2238: unexpected token(s) preceding ';' typename Base::InsideType<int> val;
解决方案
需要在Base::InsideType前添加template关键字,明确告诉编译器InsideType是一个模板,修正后的代码如下:
// 这里可以有更多类型的基类,它们都定义了`InsideType`。 struct BaseClass { template <class T> struct InsideType { }; }; // 子类可以继承一种基类。 template <class Base> struct SubClass : public Base { // 添加template关键字,指明InsideType是模板 typename Base::template InsideType<int> val; }; int main() { SubClass<BaseClass> var; return 0; }
原因解释
因为Base是模板参数,属于依赖名称,编译器在处理模板定义时无法确定Base::InsideType到底是普通类型还是模板类型。此时需要用template关键字限定,让编译器识别后面的<是模板参数列表的开始而非比较运算符,再结合typename关键字表明InsideType<int>是一个类型,即可正常编译。
内容的提问来源于stack exchange,提问作者czs108
相关产品推荐
相关产品推荐

