C++示例中为何.template关键字非必需?有无该关键字代码均正常运行
原因说明
C++里的.template消歧义关键字,仅在调用目标是依赖模板参数的待决名时才是强制要求的。如果调用对象的类型在编译阶段完全确定、不依赖任何模板参数,编译器可以直接识别成员的属性,这时候加不加.template都不会触发编译错误,两种写法语义完全一致,运行结果自然没有区别。
你给出的示例代码里,main函数中的M是MyS类型的普通局部变量,类型在声明时就完全确定,不存在任何模板参数依赖:
- 写
M.foo<int>(M.j)时,编译器查询MyS的成员定义就能直接确认foo是模板成员函数,后续的<int>会被正确解析为模板实参列表,不会被误判为小于比较运算符,根本不需要额外的.template做提示。 - 这时候额外加上
.template,本质是给编译器传递了一个“后续成员是模板”的冗余提示,编译器本来就掌握这个信息,不会判定为语法错误,只会按照正常的模板成员调用逻辑处理,和不加关键字的写法生成完全相同的代码。
补充:必须使用.template的场景
只有当你调用模板成员的对象,类型依赖于所在作用域的模板参数时,编译器在模板的第一阶段解析时无法确认对应成员是不是模板,会默认把<解析为小于号,这时候才必须加.template消歧义,否则会直接编译失败:
template<typename T> void test_call(T& obj) { // obj类型依赖模板参数T,第一阶段解析时无法确认foo是模板,必须加.template obj.template foo<int>(42); }
你示例代码的运行结果完全符合预期,四个调用本质都是直接调用MyS::foo的不同模板实例,没有因为.template的存在改变任何调用逻辑,输出如下:
b = 28 b = 29.3333 b = 22 b = 22.838
内容的提问来源于stack exchange,提问作者hsane
相关产品推荐
相关产品推荐

