2015-10-13 3 views
0

Я создал специальную функцию Шаблон и функцию без шаблона с теми же аргументами. Поскольку эффективно обе эти же функции, я не был уверен, как компилятор C++ будет запускать его, поскольку теперь он имеет две одинаковые функции, один из которых является специализированным шаблоном, а другой - не шаблонным. Я ожидал, что это приведет к ошибке компилятора, поскольку компилятор найдет две функции с одинаковыми параметрами и возвращаемым типом (в этом случае void foo (string)). Но похоже, что версия без шаблона - это та, которая выполняется при вызове. Итак, есть ли приоритет, когда это будет сделано?Шаблоны против похожих функций без шаблона

Пожалуйста, дайте мне знать, если я неправильно понял.

Код:

#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

Обратите внимание, что вы можете сделать 'foo (ввод);' для вызова версии шаблона (или даже 'foo <> (input);') – Jarod42

ответ

2

Регулярная функция Печатается «Строка нешаблонной» всегда предпочтительнее шаблон функции, даже специализация шаблона функции.

От стандарта C++:

13.3.3 Лучшей жизнеспособная функция [over.match.best]

1 Определение ИКСИ (F) следующим образом:

...

Учитывая эти определения, жизнеспособная функция F1 определена как лучшая функция, чем другая жизнеспособная функция F2, если для всех Аргументы i, ICSi(F1) не хуже последовательность преобразования, чем ICSi(F2), а затем

...

- F1 функции нешаблонная и F2 функция специализация шаблона, или, если не то, что,

+0

@R Sahu - Спасибо за это! – Invinsible

+0

@ Необратимый, конечно. Я рад возможности помочь. –

Смежные вопросы