【发布时间】:2016-01-01 20:56:26
【问题描述】:
我有一个以typename T 为模板的课程。它包含一个函数,
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) 是有效的构造函数调用)?
【问题讨论】:
-
试试
myObj_double_2 = myObj_double_2 + 5.0; -
是的 - 这将毫无困难地工作,但它并不能解决我所问的问题(尽管它是简单而明显的解决方案)
-
不存在int->双“促销”。
-
@LightnessRacesinOrbit:确实如此。例如,据我所知,声明
void foo(double);然后调用foo(3)是完全合法的,并且与foo((double)3)或foo(3.0)做同样的事情。所以这里的问题更加微妙。 -
@NateEldredge:这样的隐式转换当然存在,但那不是“促销”,不是吗?
标签: c++ templates c++11 c++14 type-promotion