2014-01-12 4 views
0

Я сделал очень простую программу для понимания функциональных шаблонов с несколькими параметрами, но я продолжаю получать это сообщение об ошибке от компилятора. Я просмотрел программу несколько раз, но я не могу понять, откуда эта проблема. Я бы очень признателен за понимание.Шаблоны функций Ошибка компилятора

#include <iostream> 
using namespace std; 

template <class FIRST, class SECOND> 
FIRST smaller(FIRST a, SECOND b) 
{ 
     return (a<b?a:b); 
} 

int main() 
{ 

    int x = 21; 
    double y = 12.2; 
    cout << smaller(x,y) << endl; 

} 

Компилятор сообщение об ошибке:

  • В функции `ПЕРВОЕ меньше (первый, второй) [с FIRST = INT, ВТОРОЕ = двойной]:

  • инстанцирован здесь

  • [предупреждение] преобразование в 'int' из 'double'

+1

компилятор дает a.clear диагностики. –

+1

BTW: Доступно уже 'std :: min()', делая это правильно ... –

+0

@ πάνταῥεῖ std :: min ожидает аргументы одного типа –

ответ

2

Прежде всего, это предупреждение, а не ошибка.

Что вы говорите, это то, что вы неявно конвертируете double в int. Это приведет к потере точности.

Преобразование происходит потому, что тип возврата является тем же самым типом, что и первый аргумент, который в вашем примере равен int.

+0

Решение -> 'std :: common_type' или' -> decltype (a 0x499602D2

0

Чтобы избежать предупреждения (thogh, это может рассматриваться компилятором как ошибка, если вы включите соответствующий параметр компилятора «рассмотрите предупреждения как ошибки»), говоря о потере точности при преобразовании из double в int you может записать функцию следующим образом

template <class FIRST, class SECOND> 
auto smaller(FIRST a, SECOND b) ->typename std::common_type<FIRST, SECOND>::type 
{ 
     return (a < b ? a : b); 
} 

, что для этого вы должны включить заголовочные <type_traits>

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