2013-06-19 10 views
7

Stworzyłem klasę Matrix, która zasadniczo reprezentuje macierz matematyczną. W celu wykorzystania mnożenie skalarne matrycy, mam przeciążony * operatora:Przeciążanie * operatora do pracy zarówno na prawo jak i na lewo

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

Aby uczynić pracę operatora od lewej, jak również, użyłem:

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

Biorąc Matrix M i double s , M * s działa dobrze, ale s * M daje mi błąd:

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

podczas IDE pokazuje mi błąd: "no operator * dopasowuje te argumenty".

Każdy pomysł, jaki może być problem?


Edytuj: To był głupi błąd! Nie zadeklarowałem operatora w nagłówku, a kompilator nie widział deklaracji! Bardzo przepraszam za to ...

+1

Pełny kod przykładowy. Nie zdefiniowałeś typu zwrotu dla swojej pierwszej definicji operatora? – Sebastian

+0

@Sebastian, To był literówka i poprawiłem to. Otrzymuję ten błąd w moim kodzie, gdzie mam mIIdevCon = mIIcon - one3 * mIIvol gdzie mIIdevCon, mIIcon, mIIvol są obiektami Matrix, a one3 to "const double Matrix :: one3 = 1.0/3.0;" – Alborz

+0

Nie mogę osiągnąć ideału, aby podać przykład, ale twój kod kompiluje się lokalnie dla mnie za pomocą prostej podwójnej matrycy *. Czy możesz stworzyć prostą, powtarzalną próbkę? –

Odpowiedz

8

Kiedy postępuję zgodnie z zaleceniami podanymi w FAQ entry on operator overloading (zwłaszcza w paragrafie na temat binarnych operatorów arytmetycznych), nie mogę odtworzyć błędu.

To kompiluje dobrze dla mnie:

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; 
} 

Mam nadzieję, że to pomaga. Jeśli nie, proszę podać więcej kodu.

+0

Dlaczego warto przyjmować M według wartości? – legends2k

+0

@ legends2k, ponieważ i tak potrzebujesz kopii, aby zwrócić wartość (można ją zoptymalizować, gdy przekażemy wartość: copy elision). – moooeeeep

+0

Co dzieje się tylko wtedy, gdy macierz ma zasoby przydzielone sterty, co jest mało prawdopodobne w przypadku macierzy (tablica zmiennych). – legends2k

Powiązane problemy