类作用域外如何调用与模板函数同名的非模板函数?
解决方法:调用同名非模板
add函数 首先明确问题根源:你写的非模板add函数参数是非常量左值引用(int&),而调用时传入的1、2是右值,无法绑定到非常量左值引用,因此编译器只能匹配参数为const T&的模板版本(该类型可以绑定右值)。
要调用非模板函数,有两种可行方案:
方案1:传入左值变量
创建可被非常量引用绑定的左值变量,再传递给add:
int main() { int a = 1, b = 2; cout << add(a, b) << endl; return 0; }
此时编译器会优先匹配非模板函数(非模板重载比模板实例化的优先级更高),就能得到你期望的输出。
方案2:修改非模板函数的参数类型
如果不想调整调用方式,可以把非模板add的参数改为const int&,让它能接受右值:
/* 修改后的非模板add函数 */ int add(const int& a, const int& b){ cout << "adding" << endl; return a+b; }
修改后,直接调用add(1,2)会优先匹配非模板版本,因为它是更精确的具体类型重载,优先级高于模板实例化。
内容的提问来源于stack exchange,提问作者Geeking
相关产品推荐
相关产品推荐

