2016-02-15 2 views
0

C++ Я видел этот код в интернете:Почему эта функция шаблона не будет скомпилирована

template <class T, class S> 
    T f(T& a, T& b, S c) { 
    T t1, t2, t3; 
    if (a==b) return t1; 
    if (c>0) return t2; 
    return t3; 
} 

СЛЕДОВАЛ эти вызовы:

f('c', 5, 5); // why this doesn't compile? 

f(3, 4, 6.0); // why does this compile? 

Первый не компилируется, а второй .. Почему?

+0

@RSahu yup, под редакцией. –

+1

Вы уверены, что хотите использовать ссылку при передаче в литерал? – Matt

+0

Спецификация шаблона предполагает, что параметры 'a' и' b' должны быть одного типа. Они не в первом, но они во втором. – andand

ответ

4

В C++ (в отличие от C) 'c' является char.

Ваш код не компилируется, потому что аргумент шаблона аргумента для параметра T не работает - он неоднозначен. В f('c', 5, 5) вызов первого аргумента функции говорит, что он должен быть char, второй говорит, что он должен быть int. Как вы ожидали, что компилятор решит эту двусмысленность?

Если вы хотите T == int вы можете указать первый аргумент шаблона явно

f<int>('c', 5, 5); 

или вы можете использовать явное приведение

f((int) 'c', 5, 5); 

Конечно, как уже отмечалось, даже если вы пройдите через проблемы вывода аргументов шаблона, вы все равно не сможете инициализировать не константные ссылки lvalue с rvalues. Оба этих вызова также неверны по этой последней причине.

+0

, но не '' c'' '' int'? –

+4

@meer khan: Нет, в C++ '' c'' является 'char'. В C это 'int', но C++ не C. – AnT

+0

Как rvalue связывается с (non const)' T & 'при вызове' f (3, 4, 6.0); '? – Zereges

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