为什么编译器允许这样做?
#include <iostream>
using namespace std;
template<typename T>
void func(T t)
{
cout<<"The value is :"<<t<<"\n";
}
template<>
void func<int>(int d) //Template Specialization
{
cout<<"Template function\n";
}
void func(int d) //Non-template function with same name & signature
{
cout<<"Non-template function\n";
}
int main()
{
func(4);
func(4.67);
func("TENE");
}
答案 0 :(得分:3)
因为这段代码完全合法。有关解决规则,请参阅this article。
答案 1 :(得分:3)
问题的答案在第13.3.3节
鉴于这些定义,如果对于所有参数i,可行函数F1被定义为更好函数而不是另一个可行函数F2,ICSi(F1)不是比ICSi更差的转换序列(F2) ),然后
- 对于某些参数j,ICSj(F1)是比ICSj(F2)更好的转换序列,或者,如果不是,
- F1是非模板函数,F2是函数模板特化,或者,如果不是,
- F1和F2是功能模板特化,F1的功能模板比F2的模板更专业,根据14.5.5.2中描述的偏序规则,或者,如果不是,...
因此,在三个选项(非模板化func
,func<int>
的专业化和通用模板func<typename T>
中,func
的非模板版本是最佳选择由于这里存在完美匹配,因此编译器没有理由查看该函数的模板化版本。