2015-01-29 3 views
3

При чтении о шаблонах я столкнулся следующий код:Основные шаблоны C++

template<class T> 
void f(T x, T y) { 
cout << "template" <<endl; 
} 

void f(int w, int z) { 
cout << "Non template" <<endl; 
} 

int main() { 
f(1,2); 
f('a','b'); 
f(1,'b'); 
} 

В книге говорится о том, что выход для этого кода будет:

Non template 

Template 

Non template 

Последняя строка, f (1, 'b'), меня озадачивает (или его выход скорее). Что такое эмпирическое правило, которое компилятор выполняет в этом случае? Спасибо заранее.

+0

Есть ли какая-то путаница здесь по поводу того, как C++ предпочитает * специализированные * реализации над типичными шаблонами? – tadman

+0

@tadman Нет. Меня это не смутило. Как заявил MichaelCMS в своем ответе, * неявная литье * часть была неопределенной концепцией здесь. – Airwavezx

ответ

5

Первая функция:

У вас есть п (Int, Int), определенный, поэтому компилятор будет считать, что один. Если вы хотите явно использовать шаблон, который вы можете назвать это нравится:

f<int>(1,2); 

Вторая функция:

Ну, вы не имеете автофокусировки (символ, символ), определенный, но он соответствовал определению шаблона , поэтому он использует это.

Третья функция:

Вы не шаблон для F (T1, T2). Однако у вас есть неявный приведение в int из char функции, которая будет принимать f (int, int). Поэтому он снова выполняет функцию.

Кроме того, если f (int, int) не будет определяться, то ваша функция Template не может быть вызвана для f (int, char), поскольку она имеет разные типы в качестве параметров.

+0

Хорошее объяснение. –

+0

Спасибо за объяснение. Это смутило меня, потому что это был * char *. И * char * to * int * casting противоречит интуиции. Я думаю, если бы это был * двойной *, возможно, я бы не стал путать. – Airwavezx

+0

С 'f (1, 'b')' можно вызвать как шаблон, так и не шаблон. И каждый будет требовать ровно одного преобразования. Итак, почему выигрыш не-шаблона? –

1

Шаблон принимает оба аргумента одного типа T.

f(1,'b') не соответствует шаблону, так как 1 и 'b' не такого.

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