2013-06-19 34 views
7

我創建了一個類Matrix基本上代表了數學矩陣。爲了使用一個標量矩陣乘法,我已經超負荷了*操作爲:重載*運算符對雙方的工作權利和左

Matrix Matrix::operator*(double scalar) const 
{ 
    Matrix result(*this); 
    result *= scalar; 
    return result; 
} 

爲了使從離開了操作員的工作量,以及,我已經使用:

Matrix operator*(double a, const Matrix &M) 
{ 
    return M * a; 
} 

鑑於Matrix Mdouble sM * s工作正常,但s * M給我一個錯誤:

Error C2677: binary * : no global operator found which takes type Matrix (or there is no acceptable conversion)

而IDE向我顯示錯誤:「沒有運算符*匹配這些操作數」

任何想法可能是什麼問題呢?


編輯:這是一個愚蠢的錯誤!我沒有在頭文件中聲明操作符,編譯器也看不到聲明!因此,對於抱歉......

+1

和完整的示例代碼。你沒有爲第一個運算符定義定義返回類型嗎? – Sebastian

+0

@塞巴斯蒂安,那是一個錯字,我糾正了它。 我得到這個錯誤在我的代碼,我有mIIdevCon = mIIcon - one3 * mIIvol其中mIIdevCon,mIIcon,mIIvol是Matrix對象和one3是 「常量雙矩陣:: one3 = 1.0/3.0;」 – Alborz

+0

不能到達ideone來舉個例子,但是你的代碼只能用一個簡單的double * Matrix在本地編譯。你能創建一個簡單的可重複樣本嗎? –

回答

8

當我遵循FAQ entry on operator overloading(二進制算術運算符尤其是段落)給出的建議我無法重現你的錯誤。

這編譯對我蠻好:

struct M { 
    M& operator*= (float f) { 
     // multiply this by f 
     return *this; 
    } 
}; 

inline M operator* (M m, float f) { 
    m *= f; 
    return m; 
} 

inline M operator* (float f, M m) { 
    return m * f; 
} 

int main() { 
    M m; 
    float f; 
    m * f; 
    f * m; 
} 

我希望這有助於。如果沒有,請提供更多的代碼。

+0

爲什麼以價值取M? – legends2k

+0

@ legends2k,因爲無論如何您都需要一個副本來返回值(當您按值傳遞時它可以被優化:copy elision)。 – moooeeeep

+0

只有矩陣具有堆分配資源時纔會發生哪種情況,這種資源對於矩陣(浮點數組)不太可能。 – legends2k