为什么编译器不会抛出编译错误?

时间:2012-04-23 09:43:12

标签: c++ templates

为什么编译器允许这样做?

#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");
}

2 个答案:

答案 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中描述的偏序规则,或者,如果不是,...

因此,在三个选项(非模板化funcfunc<int>的专业化和通用模板func<typename T>中,func的非模板版本是最佳选择由于这里存在完美匹配,因此编译器没有理由查看该函数的模板化版本。