我正在尝试重载一个乘法运算符,但不想输入多个重载函数以考虑乘以 int 和 float、int 和 double、float 和 int 等...我希望编写一个重载运算符来解释与浮点数、整数和双精度数相乘的所有组合,并获得正确的返回类型。我收到错误消息,说没有找到采用“Widget::Widget”类型的右手操作数的运算符(或者没有可接受的转换)。我认为这是因为我使用 decltype 来设置返回对象 Widget 的模板类型。如果返回不是模板对象,则使用尾随返回类型有效。
这是我尝试制作的重载运算符的示例:
template<typename T1, typename T2>
auto
operator*(const Widget<T1>& aWidge, const Widget<T2>& bWidge) -> Widget<decltype(aWidge.x*bWidge.x)>
{
Widget<decltype(aWidge.x*bWidge.x)> result;
//do stuff needed when multiplying two Widgets
return result;
}
template<typename T>
Widget<T>& Widget<T>::operator=(const Widget<T>& aWidget)
{
x = aWidget.x;
return *this;
}
这是模板类的示例
template<typename T> class Widget
{
private:
T x;
public:
Widget();
~Widget();
void SetX(T value);
Widget<T>& operator=(const Widget<T>& aWidget);
}
示例 Main.cpp
int main()
{
Widget<int> aWidge;
Widget<float> bWidge;
Widget<float> cWidge;
aWidge.SetX(2);
bWidge.SetX(2.0);
cWidge = aWidge*bWidge; //this should give a float return type
}