为何C++模板类中公有类型别名无法被继承识别?
C++模板嵌套类类型引用错误分析
问题代码
#include <string> template <class StringType> class mytype { struct mybase { using Type = StringType; }; class mychild : public mybase { typename Type somevalue; }; }; int main() { mytype<std::string> mt; }
编译错误信息
错误 C3646: 'somevalue': unknown override specifier
提示:查看对正在编译的类模板实例化 'mytype::mychild' 的引用
提示:查看对正在编译的类模板实例化 'mytype' 的引用
错误 C4430: missing type specifier - int assumed. Note: C++ does not support default-int
错误原因
问题出在mychild类中对Type的引用方式:
mybase是模板类mytype的嵌套结构体,它的成员Type依赖于模板参数StringType,属于依赖名称。- 在模板解析阶段,编译器无法确定继承自依赖基类的
Type是一个类型别名还是一个成员变量,默认会将其当作非类型名称处理。 - 你写的
typename Type somevalue是错误的,typename关键字在这里没有正确关联到Type的作用域,编译器无法识别Type是合法类型,因此报错类型说明符缺失,同时误将Type当作覆盖说明符导致C3646错误。
修正方法
需要明确告诉编译器Type来自依赖基类mybase,并通过typename声明它是一个类型,有两种常见写法:
写法一:直接限定作用域
class mychild : public mybase { typename mybase::Type somevalue; };
写法二:先引入类型别名
class mychild : public mybase { using typename mybase::Type; // 引入基类的类型别名 Type somevalue; };
这两种写法都能让编译器正确识别Type是一个类型,从而解决编译错误。
内容的提问来源于stack exchange,提问作者Cool_Cornflakes
相关产品推荐
相关产品推荐

