我正在使用模板化函数和非模板化函数。代码如下
#include <iostream>
using namespace std;
int maxOfTwo1(int a,int b)
{
return a>b?a:b;
}
template<class T>
T maxOfTwo(T a,T b)
{
return a>b?a:b;
}
int main()
{
cout<<maxOfTwo1(3,6.3);//works fine
cout<<maxOfTwo(3,6.3);//gives error
}
在第一个函数中,6.3
正在转换为 6
,但是任何人都可以解释为什么它在第二个函数中也没有发生吗?第二个功能的工作原理也相同,只是有模板。
最佳答案
推导冲突。
给定
template<class T>
T maxOfTwo(T a,T b)
{
return a>b?a:b;
}
如果调用 maxOfTwo(3,6.3)
,第一个值是 int
;第二个是 float
。
编译器必须推导出单个 T
类型,并且不知道是选择 int
还是 float
。
maxOfTwo1()
的情况有所不同,因为参数类型固定为 int
并且编译器只需转换 float
值到 int
值。
如果您至少会使用 C++14,则可以使用两种模板类型和返回的 auto
类型来解决
template <typename T1, typename T2>
auto maxOfTwo (T1 a, T2 b)
{ return a>b?a:b; }
在 C++11 中有点冗长且不太优雅
template <typename T1, typename T2>
auto maxOfTwo (T1 a, T2 b) -> decltype( a>b ? a : b )
{ return a>b?a:b; }
或者你可以使用std::common_type
(按照Yakk的建议)
template <typename T1, typename T2>
typename std::common_type<T1, T2>::type maxOfTwo (T1 a, T2 b)
{ return a>b?a:b; }
否则您可以显式调用函数的正确类型
maxOfTwo<int>(3, 6.3);
关于c++ - 模板中的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53013430/