函数模板中的返回类型有关问题
函数模板中的返回类型问题
我写了一下代码:
#include<iostream>
using namespace std;
template <class TReturn, class TArg> TReturn larger(TArg a, TArg b)
{
TArg returnInfo = a>b ? a:b;
return returnInfo;
}
int main()
{
float a=1.56;
float b=3.24;
cout<<larger<double, float>(a, b)<<endl;
cout<<larger<double>(a, b)<<endl;
cout<<larger<int>(1, 2)<<endl;
cout<<larger<int>(a, b)<<endl;//此处编译出错
system("pause");
return 0;
}
而且当
template <class TReturn, class TArg> TReturn larger(TArg a, TArg b)
改为
template <class TArg> int larger(TArg a, TArg b)
时
cout<<larger<int>(a, b)<<endl;//此处编译出错
这个错误还是存在。
但普通的函数,例如:
int aa(float a,float b)
{
return a*b;
}
却可以用
float a=1.5,b=2.6;
cout<<aa(a, b)<<endl;
调用
我想问的是:在函数模板中,函数实例化后函数体内部”return“后返回的数据类型是否必须与调用函数时给出的参数列表内指定的函数返回值类型一样或兼容?
我是新人,没多少分,希望各位大虾谅解。
------解决方案--------------------
楼主的代码应该不会有错,顶多就是几个warning.
return returnInfo;returnInfo的类型最好是跟函数返回类型TReturn 一致。
否则,float->double或int->float都会丢失精度。
再者,如果函数是封装的呢?岂不是自己挖坑把自己和别人一起埋掉。
------解决方案--------------------
我在vc2003里面是可以通过,并且没有警告;因为vc对模板机制支持的不是特别的好;
我查了一下资料:函数返回值的实参在编译期是不会被演绎的,只不过为了显式的指定这些参数而将这些实参所对应的参数放在了模板参数列表的开始处;
例如:
template<typename DstT, typename SrcT>
inline DstT implict_cast(SrcT const& x)
{
return x;
}
函数中的返回值DstT,
lz程序中的TReturn情况也类似的;
------解决方案--------------------
我用的是devc++,但编译不通过,错误如下:
In function `TReturn larger(TArg, TArg) [with TReturn = int, TArg = float]':
instantiated from here
[Warning] converting to `int' from `float'
你这只是警告,不是错误的
我写了一下代码:
#include<iostream>
using namespace std;
template <class TReturn, class TArg> TReturn larger(TArg a, TArg b)
{
TArg returnInfo = a>b ? a:b;
return returnInfo;
}
int main()
{
float a=1.56;
float b=3.24;
cout<<larger<double, float>(a, b)<<endl;
cout<<larger<double>(a, b)<<endl;
cout<<larger<int>(1, 2)<<endl;
cout<<larger<int>(a, b)<<endl;//此处编译出错
system("pause");
return 0;
}
而且当
template <class TReturn, class TArg> TReturn larger(TArg a, TArg b)
改为
template <class TArg> int larger(TArg a, TArg b)
时
cout<<larger<int>(a, b)<<endl;//此处编译出错
这个错误还是存在。
但普通的函数,例如:
int aa(float a,float b)
{
return a*b;
}
却可以用
float a=1.5,b=2.6;
cout<<aa(a, b)<<endl;
调用
我想问的是:在函数模板中,函数实例化后函数体内部”return“后返回的数据类型是否必须与调用函数时给出的参数列表内指定的函数返回值类型一样或兼容?
我是新人,没多少分,希望各位大虾谅解。
------解决方案--------------------
楼主的代码应该不会有错,顶多就是几个warning.
return returnInfo;returnInfo的类型最好是跟函数返回类型TReturn 一致。
否则,float->double或int->float都会丢失精度。
再者,如果函数是封装的呢?岂不是自己挖坑把自己和别人一起埋掉。
------解决方案--------------------
我在vc2003里面是可以通过,并且没有警告;因为vc对模板机制支持的不是特别的好;
我查了一下资料:函数返回值的实参在编译期是不会被演绎的,只不过为了显式的指定这些参数而将这些实参所对应的参数放在了模板参数列表的开始处;
例如:
template<typename DstT, typename SrcT>
inline DstT implict_cast(SrcT const& x)
{
return x;
}
函数中的返回值DstT,
lz程序中的TReturn情况也类似的;
------解决方案--------------------
我用的是devc++,但编译不通过,错误如下:
In function `TReturn larger(TArg, TArg) [with TReturn = int, TArg = float]':
instantiated from here
[Warning] converting to `int' from `float'
你这只是警告,不是错误的