2014-10-04 68 views
1

我想重载操作:C++敌不过运算符*

static Vector operator*(float s, Vector right){ 
    Vector result(right.getX()*s, right.getY()*s, right.getZ()*s); 
    return result; 
} 

当我想用它:

Vector a(0,1,5) 
Vector v(4*a); 

我:

error: no match for 'operator*' (operand types are 'int' and 'Vector') 

有什么不对?

+2

请发布[MCVE](http://stackoverflow.com/help/mcve)。 – juanchopanza 2014-10-04 15:34:40

+0

这个'operator *'声明在哪里?为什么它是静态的? – Shoe 2014-10-04 15:34:48

+1

你试过Vector v(4.0 * a); – rahulroy9202 2014-10-04 15:36:01

回答

-1

您需要声明(类声明中)的operator *作为非静态的非成员和朋友,如:

friend Vector operator*(float s, Vector right); 

,并定义为(外类声明):

Vector operator*(float s, Vector right){ 
    return Vector(right.getX()*s, right.getY()*s, right.getZ()*s); 
} 

运算符*在这里用作二元运算符。如果你作为成员,那么第一个参数被隐含地当作当前对象(例如,如果你使用x * y,那么operator *适用于x的成员)。但是,对于非成员,这两个参数都可以是非矢量类型,如果需要,可以将其转换为矢量。 这将甚至工作,如果你作为非会员非朋友和静态(在类声明之外定义)

+0

作品,为什么用这种方式解释?我作为问题发布的东西是示例的一部分。这就是为什么有静态的原因。 – keid 2014-10-04 15:50:51

+0

@keid,关于成员或非成员的解释 – 2014-10-04 15:54:04

+0

它不应该是一个朋友,除非构造函数或访问函数是私有的(这很奇怪)。 – 2014-10-04 15:54:05

-1

根据C++标准(13.5重载操作)

6的操作员功能应或者是一个非静态成员函数或 是非成员函数

定义类的外部功能

Vector operator *(float s, const Vector &right) 
{ 
    Vector result(right.getX() * s, right.getY() * s, right.getZ() * s); 
    return result; 
} 

考虑有分t成员函数getX(),getY()和getZ()应该用限定符const定义。例如

float getX() const; 
+2

什么告诉你这是一个成员函数?如果这是他接收静态向量Vector :: operator *(float,Vector)''必须是非静态成员函数或非成员函数或者沿着这些行的东西的问题,获得。 – Shoe 2014-10-04 15:37:48

+0

@Sofffia我想,它是在关键字static类中声明的。在任何情况下,标准的引用在这种情况下非常有用。 – 2014-10-04 15:40:41