【发布时间】:2018-03-11 17:02:30
【问题描述】:
我无意中发现以下两个模板可以重载(不要导致名称重定义错误),我认为这是违反直觉的。
template<typename T>
void func(T) {}
template<typename T>
int func(T) {return 0;}
来自cppreference.com,有一段相关的段落:
当表达式使用类型或非类型模板参数时 出现在函数参数列表或返回类型中,即 表达式仍然是函数模板签名的一部分 重载的目的:
但这两个函数的返回类型不包括T。谁能帮我解释一下?
【问题讨论】:
-
现在尝试实际调用
func(),而不会导致过载失败。 -
模板其实就是宏定义;在扩展模板之前,编译器无法检测到模板中的大多数错误。尝试调用 func。
标签: c++ templates overloading