模板与类似的非模板函数

时间:2015-10-13 06:18:06

标签: c++ templates

我创建了一个模板专用函数和一个具有相同参数的非模板函数。由于两者都是相同的函数,我不确定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;
}

1 个答案:

答案 0 :(得分:3)

常规函数总是优于函数模板,甚至是函数模板的特化。

来自C ++标准:

  

13.3.3最佳可行功能[over.match.best]

     

1如下定义ICSi(F):

     

...

     

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

     

...

     

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