1

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

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

2 回答 2

3

因为这段代码是完全合法的。有关解析规则,请参阅本文

于 2012-04-23T09:51:39.580 回答
3

问题的答案在第 13.3.3 节

鉴于这些定义,如果对于所有参数 i,ICSi(F1) 不是比 ICSi(F2) 更差的转换序列,则可行函数 F1 被定义为比另一个可行函数 F2更好的函数,然后

— 对于某些参数 j,ICSj(F1) 是比 ICSj(F2) 更好的转换序列,或者,如果不是,

— F1 是非模板函数,F2 是函数模板特化,或者,如果不是,

— F1 和 F2 是函数模板特化,根据 14.5.5.2 中描述的偏序规则,F1 的函数模板比​​ F2 的模板更特化,或者,如果不是这样,......

所以在三个选择(non-templated func、 specialization offunc<int>和generic template func<typename T>)中,non-template 版本func是最好的。由于这里完美匹配,编译器没有理由甚至查看模板版本的功能。

于 2012-04-23T10:12:52.507 回答