2 qq 21044655 qq_21044655 于 2015.06.06 23:04 提问

c++重载决议具体化优先于函数模板
c++

template void f(T a){ cout << "aaaaaaa"; }
template <> void f(int & a){ cout << "fffffffffff"; }
int b;f(b);
为什么输出aaaaaaa,不是应该输出fffffffffff吗,看书上说具体化优先于模板函数的

求知道的大神指点下啦,万分感谢

5个回答

devmiao
devmiao   Ds   Rxr 2015.06.06 23:23
 #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

devmiao
devmiao   Ds   Rxr 2015.06.07 00:22

如果你这么写

# include <iostream>
using namespace std;

template <> void f(int &a){ cout << "fffffffffff"; }

int main()
{
    int bb=9;
    f(bb);

    return 0;
} 

根本认不到f
说明不是重载选择的问题,而是后面那个函数根本不合法。

devmiao
devmiao 回复qq_21044655: 看我的代码,认不到f的
2 年多之前 回复
qq_21044655
qq_21044655 http://codepad.org/PNFbR2Hc
2 年多之前 回复
nswcfd
nswcfd   2015.06.09 10:49

很奇怪,在g++上的结果确实的第一个,即来自函数模版,而非其特例。

ps,如果把特例的参数,从int &修改为int(去掉引用),行为就正常了。

看起来,模版推导的逻辑,对引用有什么特别的规则?

nswcfd
nswcfd   2015.06.09 11:28

http://stackoverflow.com/questions/4677592/specializing-function-template-for-reference-types
如果一定要int&版本的命中,不要使用模版,而使用overload机制。

nswcfd
nswcfd   2015.06.09 11:39

感觉函数模版的推导逻辑是,先在多个模版之间选择最合适的模版,然后看最合适的模版有没有特化。就这个例子而言,由于只有一个模版,那么根据f(bb)得到T=int,而第二个是针对int&的特化,两者不匹配。

nswcfd
nswcfd PS,stackoverflow上有人回答,A reference is just an alias, not a type. So when you call f(z), it matches the first version with T=int, which is a better option that T=int&。
2 年多之前 回复
nswcfd
nswcfd 模块的推导(Template argument deduction)的规则挺复杂的,http://en.cppreference.com/w/cpp/language/function_template有一段描述。
2 年多之前 回复
qq_21044655
qq_21044655 当type传给type &时,是无关紧要的转换,这是与type传给tpye完全匹配的。type表任意类型。书上看的
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片