显式调用模板类方法时模板标识符<与二元运算符<产生识别混淆问题咨询
解决方法
你只需要在调用模板成员函数前显式添加template关键字,告诉编译器后续的<是模板参数的分隔符,不是比较运算符,修改后的派生类代码如下:
template<typename T> class Derived : public Base<T> { public: void use_toto(){ this->template toto<1>(); } };
修改后即可正常编译运行。
原理说明
在模板类的继承场景中,Base<T>是依赖模板参数T的依赖类型,它的成员名称在模板第一阶段名称查找时是不可见的,编译器此时无法判断toto是一个模板成员函数。如果没有加template关键字,编译器会默认把后续的<解析为小于比较运算符,自然就会出现类型不匹配的报错。
按照C++标准要求,当你需要调用依赖类型的模板成员时,必须在成员名称前显式添加template关键字,帮助编译器正确识别语法结构。
其他等价写法
如果你不需要考虑toto函数的多态特性,也可以用基类限定的方式调用,效果是一样的:
Base<T>::template toto<1>();
这种写法同样会显式告诉编译器toto是基类的模板成员函数,避免语法解析错误。
内容的提问来源于stack exchange,提问作者Johann Bzh
相关产品推荐
相关产品推荐

