2012-12-04 39 views
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)。我从互联网上某些模板的文档阅读这一概念。

请清除我的疑惑,否则我无法进一步处理。

+2

你需要阅读更多有关模板。 'template '中的'T'是用于_both_参数的类型,并且您在调用中明确将其设置为'int'。 –

+0

是Joachim.even这是我的理解,但我读了http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1上述概念。你能告诉我,我明白的是错的还是不是? –

回答

1
std::cout << max<int>(120,14.55); 

这条线被equavivalent使用功能 INT MAX(INT,INT)的,所以编译器给出了从14.55至14的警告转换 - 可能的数据丢失。

如果要比较不同势类型的数据,你应该在main.cpp中使用

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

后:

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

,但它不这样做的最佳方式。

+0

如果是这种情况,那么如果我尝试与最大(120,14.55);再次,我应该只得到警告。但我得到编译时错误.Below是错误>错误:没有匹配函数调用max(int,double)。 –

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很可能会需要得到一个正确的返回键入这样的功能。

+1

有关返回类型,请参见['std :: common_type'](http://en.cppreference.com/w/cpp/types/common_type)。 –

0

why this warning came is my question since i have already instantiated for T max(int t1,double t2) .

不,你没有。提供int作为模板参数与int替换参数出现的所有实例的模板:

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

Because as per my understanding here if i explicitly mention only one data type (here int), other would be deducted from the argument type

号你的模板只有一个参数,用于两个函数参数类型;所以,如果你指定的参数,那么它同时用于(和返回类型也一样)。如果您希望这些单独parametrised,那么你就需要为每个单独的参数。

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) 
+0

迈克感谢您的快速回复我的疑问也正是在这部分你所说的最大(120,14.55); //“int”给出,“double”推导出来 - >这意味着T max(T t1,T t2)应该变成int max(int t1,double t2)。那么为什么我们推导出double? –

+0

你能否说清楚这一点?你说的是我的确切疑问? –

+0

@SubiSuresh:你的模板只有一个参数'T'。如果你指定它应该是'int',那么它将在任何地方都是'int' * - 特别是函数声明将是'int max(int,int)'。我的示例模板有两个参数,'T1'和'T2',可以单独指定;指定第一个没有指定第二个,可以自由地推导出来。 –