C++ 函数模板编译器错误

C++ 函数模板编译器错误,c++,C++,我制作了一个非常简单的程序来理解带有多个参数的函数模板,但是我一直从编译器那里得到这个错误消息。我已经看了很多遍这个程序,但我似乎不明白问题是从哪里来的。我真的很感激你的洞察力 #include <iostream> using namespace std; template <class FIRST, class SECOND> FIRST smaller(FIRST a, SECOND b) { return (a<b?a:b); } int m

我制作了一个非常简单的程序来理解带有多个参数的函数模板,但是我一直从编译器那里得到这个错误消息。我已经看了很多遍这个程序,但我似乎不明白问题是从哪里来的。我真的很感激你的洞察力

#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;

}
#包括
使用名称空间std;
模板
第一个较小(第一个a,第二个b)
{

返回(a首先,这是一个警告而不是错误

它告诉您的是,您正在将
double
隐式转换为
int
。这将导致精度损失


转换之所以发生,是因为返回类型与第一个参数的类型相同,在您的示例中是
int

以逃避警告(但如果您打开相应的编译器选项“将警告视为错误”,编译器会将其视为错误)关于从double转换为int时的精度损失,您可以按以下方式编写函数

template <class FIRST, class SECOND>
auto smaller(FIRST a, SECOND b) ->typename std::common_type<FIRST, SECOND>::type
{
      return ( a < b ? a : b );
} 
模板
自动缩小(第一个a,第二个b)->typename std::common_type::type
{
返回(a

要做到这一点,您必须包括标题

编译器,给出一个.clear diagnostic.BTW:已经有
std::min()
可用,正确地执行此操作…@πάνταῥεῖ std::min需要相同类型的参数solution->
std::common_type
->decltype(a