问题描述
- c++重载决议具体化优先于函数模板
-
template void f(T a){ cout << "aaaaaaa"; }
template <> void f(int & a){ cout << "fffffffffff"; }
int b;f(b);
为什么输出aaaaaaa,不是应该输出fffffffffff吗,看书上说具体化优先于模板函数的求知道的大神指点下啦,万分感谢
解决方案
#include <iostream>
using namespace std;
template <typename T>void f(T a){ cout << "aaaaaaa"; }
void f(int & a){ cout << "fffffffffff"; }
int main()
{
int b;
f(b);
}
http://codepad.org/iyORv2CE
在线运行的结果
输出的是fffffffffff
解决方案二:
如果你这么写
# include <iostream>
using namespace std;
template <> void f(int &a){ cout << "fffffffffff"; }
int main()
{
int bb=9;
f(bb);
return 0;
}
根本认不到f
说明不是重载选择的问题,而是后面那个函数根本不合法。
解决方案三:
很奇怪,在g++上的结果确实的第一个,即来自函数模版,而非其特例。
ps,如果把特例的参数,从int &修改为int(去掉引用),行为就正常了。
看起来,模版推导的逻辑,对引用有什么特别的规则?
解决方案四:
http://stackoverflow.com/questions/4677592/specializing-function-template-for-reference-types
如果一定要int&版本的命中,不要使用模版,而使用overload机制。
解决方案五:
感觉函数模版的推导逻辑是,先在多个模版之间选择最合适的模版,然后看最合适的模版有没有特化。就这个例子而言,由于只有一个模版,那么根据f(bb)得到T=int,而第二个是针对int&的特化,两者不匹配。
时间: 2024-11-18 04:46:31