2014-10-04 71 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