我有一个以 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
的两次扣除生产 double
和 int
, 不一样,所以扣法失败。
你可以做的只是使用一个函数参数进行模板参数推导,而另一个不推导:
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/