2013-06-19 21 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