2

我开始阅读有关模板的内容,但对以下内容感到困惑。

template<class T>
T max(T t1, T t2)
{
   if (t1 > t2)
      return t1;
   return t2;
}

int main(){
   std::cout<<max<int>(120,14.55);
   return 0;
}

输出为 120。但是当我编译上面的代码时,我收到了这个警告:

warning:passing double for argument 2 to T max(T, T) [with T = int].

我的问题是为什么会出现这个警告,因为我已经为T max(int t1,double t2).

因为根据我在此处的理解,如果我明确提及仅一种数据类型(此处),编译器int将从参数类型()中扣除其他数据类型。14.55这意味着在这种情况下T max(T t1, T t2)实例化。T max(int t1,double t2)我从 Internet 上的一些模板文档中读到了这个概念。

请清除我的疑虑,否则我无法继续进行。

4

3 回答 3

2

您的特定模板只有一个模板参数,T. 这意味着max<int>创建了这个:

int max(int t1, int t2)

没有办法max(int, double)从这个模板中生成。如果您想要混合类型的参数,则模板必须如下所示:

template <typename T1, typename T2>
/*some return type*/ max(T1 t1, T2 t2)

但是,现在要确定返回类型应该是什么并不容易,并且type_traits可能需要为这样的函数派生正确的返回类型。

于 2012-12-04T10:58:57.810 回答
1
std::cout << max<int>(120,14.55);

此行等同于使用函数 int max(int, int),因此编译器会给出从 14.55 转换为 14 的警告 - 可能丢失数据。

如果你想比较不同类型的数据,你应该使用

template<class T, class T1, class T2>
T max(T1 t1, T2 t2)
{
   if (t1 > t2)
      return T(t1);
   return T(t2);
}

稍后在 main.cpp 中:

float a = max<float, int, double>(10, 11.0);

但这不是最好的方法。

于 2012-12-04T10:55:01.500 回答
0

为什么会出现这个警告是我的问题,因为我已经为T max(int t1,double t2).

不,你没有。提供int作为模板参数通过将所有出现的参数替换为来实例化模板int

T max(T t1, T t2)    becomes    int max(int t1, int t2)

因为根据我的理解,如果我明确提及仅一种数据类型(此处为 int),则将从参数类型中扣除其他数据类型

不,您的模板只有一个参数,用于两种函数参数类型;因此,如果您指定该参数,则它同时用于两者(以及返回类型)。如果您希望这些单独参数化,那么您需要为每个单独的参数。

template <typename T1, typename T2>
???? max(T1 t1, T2 t2)

如何最好地指定返回类型留作练习。

现在,如果你只提供第一个参数,第二个是从第二个函数参数推导出来的:

max<int>(120,14.55);  // T1=int given, T2=double deduced -> max(int,double)
max(120,14.55)        // T1=int, T2=double both deduced  -> max(int,double)
于 2012-12-04T11:03:03.027 回答