c++ 不同类型名的模板参数演绎

qlvxas9a  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(106)

我定义了一个泛型函数,如下所示:

template <typename T1, typename T2>
T2 Calculation(T1 arg_one, T1 arg_two)
{
    return arg_one + arg_two * 3.14;
}

当我尝试使用这个通用函数时,如下所示:

auto sum = Calculation(2, 3.2);

编译器告诉我:找不到匹配的重载函数。但是,当我尝试使用这个通用函数(如Calculation<double, double>)时,它工作得很好。
为什么编译器不能推断出第一个示例中参数和返回值的类型?我必须显式定义类型吗?

wvmv3b1j

wvmv3b1j1#

问题T2不能从任何函数参数推导出来,T2也没有任何默认参数,模板参数不能从返回类型推导出来。

解决这个问题,您可以在调用函数时显式指定T2的模板参数,或者将T1 arg_two更改为T2 arg_two,以便T2也可以像T1一样推导,如下所示:

template <typename T1, typename T2>
//-------------------------vv---------->changed T1 to T2 so that T2 can be deduced from passed second argument
T2 Calculation(T1 arg_one, T2 arg_two)
{
    return arg_one + arg_two * 3.14;
}

auto sum = Calculation(2, 3.2); //works now
a14dhokn

a14dhokn2#

此模板代码的返回类型绑定到第二个参数类型。
请考虑更通用的方法来推导返回类型:

auto Calculation(auto arg_one, auto arg_two)
{
    return arg_one + arg_two * 3.14;
}

相关问题