2010-09-20 7 views
0

J'essaye de préformer la surcharge de l'opérateur en C++; pour une raison quelconque le compiles ne cesse de me donner l'erreursurcharge de l'opérateur C++

error: ‘bool Matrix::operator==(const Matrix&, const Matrix&)’ must take exactly one argument

Maintenant, je sais qu'il ya un moyen de lui avec un argument à l'aide, mais je compris qu'en utilisant ami, je peux le faire de cette façon , mais ça ne marche toujours pas.

Voici mon code,

Merci d'avance.

class Matrix{ 
public: 
Matrix(); 
friend bool operator==(Matrix &mtrx1,Matrix &mtrx2); 
friend bool operator!=(Matrix &mtrx1,Matrix &mtrx2); 

protected: 
std::vector<Cell> _matrix; 
int _row; 
int _col; 

}; 

inline bool Matrix::operator==(const Matrix& mtrx1, const Matrix& mtrx2){ 

/* .......... */ 
} 
+1

Pour formater le code bien, indentera avec 4 places, ou sélectionnez-le et appuyez sur le bouton 0s et 1s. –

Répondre

5

Bien que vous avez mis la déclaration friend dans la classe, il est pas membre. Ainsi, la définition de la fonction devrait être un non-membre:

inline bool operator==(const Matrix& mtrx1, const Matrix& mtrx2) {...} 

Vous devez également ajouter const qualificatifs aux arguments des déclarations, pour correspondre à celles de la définition.

+0

J'ai essayé de le changer .. il donne toujours la même erreur :( – bass

+1

Notez, cependant, que la déclaration 'friend' l'oblige à être un non-membre, même si vous le définissez in-place dans la définition de classe, –

+1

@Jerry Coffin: ou, plus strictement, une fonction appartenant à l'espace de noms le plus interne entourant la classe donnée –

1

Vous le faites avec 2 paramètres si vous le faites en dehors de la classe, pas en tant que fonction membre.

En fonction de membre, vous devez seulement 1 paramètre (l'autre paramètre est *this)

+0

... et vous n'aurez pas besoin d'un ami si vous implémentez dans le cadre de la classe –

8

Le operator==membre fonction est déclarée comme:

class foo { 
    public: 
    bool operator==(foo const & rhs) const; 
}; 

La operator==fonction globale est déclarée :

bool operator==(foo const & lhs, foo const & rhs); 

Généralement, la fonction membre est déclarée et définie en premier. Ensuite, la fonction globale est définie en termes de la fonction membre en tant que

Un seul entre la fonction membre et la fonction globale est déclaré et défini. Ayant tous les deux est ambigu pour des déclarations comme (1) dans les domaines suivants

foo f1; 
foo f2; 
bool f1EqualsF2 = (f1 == f2); // (1), ambiguous 

et dans de tels cas d'erreur du compilateur retourne. En g ++, le message d'erreur ressemble

equals.cpp:24: error: ambiguous overload for ‘operator==’ in ‘f1 == f2’ 
equals.cpp:8: note: candidates are: bool foo::operator==(const foo&) const 
equals.cpp:17: note:     bool operator==(const foo&, const foo&) 

Chaque fois que operator== est fait, son recommandé de faire le operator!= correspondant.

+1

N'oubliez pas le const sur la méthode opérateur ==() –

+2

Ceci est faux Généralement vous définissez soit une fonction membre _ou_ vous définissez une fonction libre Vous ne devez pas définir les deux sinon "a == b" sera généralement Une fonction libre est généralement préférée car elle conduit à des règles de conversion implicites cohérentes pour les deux opérandes gauche et droit.En l'état actuel, vous ne pouvez pas faire 'lhs.operator == (rhs)' car 'operator ==' est un non -'const' m fonction de brai et est 'private' dans' foo'. –

+0

Merci à Martin York et Charles Bailey (+1 pour eux); J'ai apporté quelques corrections dans la réponse (ajouté 'const' dans la fonction membre, et le qualificateur' public'). – Arun

3
class Matrix{ 
public: 
    Matrix(); 
    friend bool operator==(const Matrix &mtrx1, const Matrix &mtrx2); 
    friend bool operator!=(const Matrix &mtrx1, const Matrix &mtrx2); 

protected: 
    std::vector<Cell> _matrix; 
    int _row; 
    int _col; 
}; 

inline bool operator==(const Matrix& mtrx1, const Matrix& mtrx2){ 
    /* .......... */ 
    return true; 
} 

Passez la compilation dans Visual Studio 2005.

  1. omettent le qualificatif const dans votre déclaration ami

  2. ne ont pas besoin Matrice :: fonctionnement == définition