2011-06-16 35 views
4

我確定這已經在某個地方得到了回答,但我不知道要搜索什麼。C++運算符在表達式中的重載

我有以下情況。我創建了一個Vector類,並重載了「*」(乘以escalar)和「+」運算符(添加兩個向量)。現在,下面的代碼行:

Vector sum = (e_x*u_c) + (e_y*u_r); 

這給了我下面的錯誤:

error: no match for 'operator+' in '((Teste*)this)->Teste::e_x.Vector::operator*(u_c) + ((Teste*)this)->Teste::e_y.Vector::operator*(u_r)' 

但是,如果我被替換此錯誤行:

Vector aux = (e_x*u_c); 
Vector aux2 = (e_y*u_r); 
Vector sum = aux + aux2; 

我沒有得到任何錯誤在所有。爲什麼?這兩種表達方式是不是等同?

編輯: 這裏有 「*」 和 「+」 我的定義:]

Vector Vector::operator+(Vector& right) 
{ 
    return Vector(x + right.x, y + right.y, z + right.z); 
} 
double Vector::operator*(Vector& right) 
{ 
    return this->scalar_product(right); 
} 
+0

,你能否告訴我們的操作符重載的定義是什麼? – fredoverflow 2011-06-16 19:57:49

+0

是的。我將它添加到問題 – 2011-06-16 19:58:42

+0

e_x和e_y是Vector類型的,對不對? – 2011-06-16 19:59:28

回答

10

更換Vector& rightconst Vector& right

表達式(e_x*u_c)是一個右值,對非const的引用不會綁定到右值。

此外,成員函數本身應該被標記const,以及:

Vector Vector::operator+(const Vector& right) const 
{ 
    return Vector(x + right.x, y + right.y, z + right.z); 
} 

double Vector::operator*(const Vector& right) const 
{ 
    return this->scalar_product(right); 
} 

scalar_product也將不得不被標記const。閱讀更多關於const正確性的信息here

+0

啊對!這使得100%的感覺現在!它不能將運算符應用於右值,因爲我可以更改它(不使用const關鍵字)感謝修復和解釋! – 2011-06-16 20:06:47

1

聲明不正確。

T T::operator +(const T& b) const;​ 

T T::operator *(const T& b) const; 

Operators in C and C++