考虑
Class Wow{
public:
//main metod
template<typename T>
void foo(T t){
cout << t << endl;
}
template<>
void foo<int>(int t){
cout << "specialization" << endl;
}
void foo(int t){
cout << "overloading" << endl;
}
}
,主要是
Wow wow;
wow.foo(2.2);
wow.foo(1);
此输出
2.2
overloading
我的问题是为什么甚至编译?
实际上,foo
被定义为void foo(int)
两次。
1)为什么会通过?
2)为什么编译器会选择重载?
由于
答案 0 :(得分:1)
1)因为这里没有问题。有模板功能,功能模板专用和重载。您可以像这样调用模板专业化:
wow.foo<int>(3);
2)如果编译器可以使用arg调用此函数,则重载与模板特化相比具有更好的匹配。
n4926 13.3.3 / 1.7
鉴于这些定义,可行函数F1被定义为a 如果对于所有参数,比另一个可行函数F2更好的功能 i,ICSi(F1)的转换序列不比ICSi(F2)差,并且 然后
F1不是功能模板专用,F2是功能 模板专业化