c++ - 为什么我的模板函数不将 'int' 提升为 'T' ,其中 'T' = 'double' ?

标签 c++ templates c++11 c++14 type-promotion

我有一个以 typename T 为模板的类(class).它包含一个函数,

template <typename T, size_t a>
myClass<T,a> operator+(myClass<T,a> lhs, const T& rhs) {
    return lhs += rhs;
}

myClass<T,a> myClass<T,a>::operator+=(const T& rhs) {
    // Do addition, depends on 'a'.
    return *this;
}

例如,当我调用它时

myClass<double, 2> myObj_double_2(constructor args);
myObj_double_2 = myObj_double_2 + 5.2;

我没问题。

如果我打电话

myObj_double_2 = myObj_double_2 + 5;

然后编译器给我一条消息,例如 - No match for 'operator+' (operand types are 'myClass<double, 2ul>' and 'int'). Candidates are ... note: deduced conflicting types for parameter 'const T' ('double' and 'int') .

我能否以某种方式编写代码以允许传递转换为 T 的其他类型? (例如,因为 double(5) 是有效的构造函数调用)?

最佳答案

当您使用模板参数推导时,一个模板参数的所有推导必须具有相同的结果。

在您的情况下,T 的两次扣除生产 doubleint , 不一样,所以扣法失败。

你可以做的只是使用一个函数参数进行模板参数推导,而另一个不推导:

template <typename T, std::size_t A>
void foo(myClass<T, A> arg1, typename std::common_type<T>::type arg2);
//                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

请注意 std::common_type<T>::type本质上只是T , 但因为 arg2 的类型现在是一个依赖类型(它的名字出现在 :: 的右边),它不会被推导出来。因此,只有第一个参数参与推演并产生T = double。毫无疑问,然后第二个函数参数的类型为 double ,然后进行通常的转换。

根据经验,模板参数推导不会跨越 :: .

关于c++ - 为什么我的模板函数不将 'int' 提升为 'T' ,其中 'T' = 'double' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32944584/

相关文章:

c++ - 我的 C++ 类必须是 Windows 8 Metro 风格应用程序中的引用类吗?

c++ - 现在如何在 C++11 中编写 for 循环?

c++ - 在 const 成员函数中使用 this 指针 (C++)

c++ 用作虚拟基础的类可以具有带参数的构造函数吗?

c++ - 特化此函数模板时不能省略模板参数

c++ - 如何只为模板赋值一次?

c++ - 将原始指针视为基于范围的 for 循环中的范围

c++ - 向下指针键入与 shared_ptr 一起使用的级别

c++ - 与 MinGW (v.4.3.0) 和 libhid 的链接问题

c++ - 嵌套模板与移位运算符