我创建了一个模板专用函数和一个具有相同参数的非模板函数。由于两者都是相同的函数,我不确定C ++编译器如何运行它,因为它现在有两个相同的函数,一个是专用模板,另一个是非模板函数。我原以为这会导致编译错误,因为编译器会找到两个具有相同参数和返回类型的函数(在本例中为void foo(string))。但看起来非模板版本是在调用它时执行的版本。 这样做有优先权吗?
如果我误解了,请告诉我。
代码:这会打印' String Non-Template'
#include <iostream>
#include <string>
using namespace std;
template<typename T>
void foo(T input)
{
cout <<"Generic Template"<<endl;
}
template<>
void foo<string>(string input)
{
cout <<"String Template"<<endl;
}
void foo(string input)
{
cout <<"String Non-Template"<<endl;
}
int main() {
string input = "abc";
foo(input);
return 0;
}
答案 0 :(得分:3)
常规函数总是优于函数模板,甚至是函数模板的特化。
来自C ++标准:
13.3.3最佳可行功能[over.match.best]
1如下定义ICSi(F):
...
鉴于这些定义,如果所有参数
F1
,F2
都不是更差,则可行函数i
被定义为比另一个可行函数ICSi(F1)
更好的函数转换序列比ICSi(F2)
,然后...
-
F1
是非模板函数,F2
是函数模板特化,或者,如果不是,