我有一个类operator*
以标量作为参数,允许我用标量执行我的类的实例的乘法运算。我希望能够将标量乘以我的类的实例(具有相同结果的逆序)。我怎么能这样做?
这是一个例子:
class Vector3d
{
public:
Vector3d(double x, double y, double z) {
v[0] = x; v[1] = y; v[2] = z;
}
template<typename T>
Vector3d operator*(const T s) const {
return( Vector3d( v[0] * s, v[1] * s, v[2] * s));
}
//protected: example purpose
double v[3];
};
main()
{
double scalar = 2.0;
Vector3d vector(1.0,2.0,3.0);
Vector3d v2 = vector*scalar;
//This is the operation I want to be able to perform !
//Vector3d v3 = scalar*vector;
return 0;
}
我尝试像使用ostream<<
运算符一样实现它而没有成功......
template<typename T>
Vector3d operator*(T& s, const Vector3d &v)
{
return( Vector3d( v[0] * s, v[1] * s, v[2] * s));
}
答案 0 :(得分:4)
您必须使用反向参数顺序将运算符*声明为非成员函数(外部类),并从中调用另一个
template<typename T>
Vector3d<T> operator*(T& s, const Vector3d<T> &v)
{
return Vector3d(v.v[0] * s, v.v[1] * s, v.v[2] * s);
}
template<typename T>
Vector3d<T> operator*(const Vector3d<T> &v, T& s)
{
return s * v; //call the other overload
}
不要忘记指定模板参数:
Vector3d<T>
^^^
还有一个问题......为什么T&
取代const T&
或T
?在当前形式中,您将阻止rvalues传递。例如,这不会编译:
Vector3d<int> v;
v*3; //3 isn't an lvalue, cannot bind to a nonconst reference
答案 1 :(得分:1)
最好在课外进行操作符重载,这样可以获得最大的灵活性。
//编译得很好。
class Vector3d
{
public:
Vector3d(double x, double y, double z) {
v[0] = x; v[1] = y; v[2] = z;
}
double v[3];
};
template<typename T>
Vector3d operator*(const T& s, const Vector3d &v)
{
return( Vector3d( v.v[0] * s, v.v[1] * s, v.v[2] * s));
}
int main(int argc, char **argv)
{
double scalar = 2.0;
Vector3d vector(1.0,2.0,3.0);
Vector3d v3 = scalar * vector;
return 0;
}