c++ - 模板中的类型转换

标签 c++ c++11 templates type-conversion type-deduction

我正在使用模板化函数和非模板化函数。代码如下

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

相关文章:

c++ - 动态数组的初始化列表?

c++ - 在 CPU 上并行减少数组

c++ - 候选模板被忽略 : deduced conflicting types for parameter: <const T &> vs <T &>

c++ - 防止为给定类型实例化模板化成员函数

c++ - 在模板特化中使用 typedef

c++ - 当它是模板参数时默认成员变量指针

c++ - 如何使用智能指针对象执行成员函数指针?

c++ - 将 MinGW 从 4.4.1 更新到 4.7.1 后,SFML 项目将无法运行

c++ - 没有 Boost 的现代 C++ 中的 bimap 实现

c++11 - std::condition_variable::wait_for 在给定 std::chrono::duration::max 时立即退出