2011-11-24 4 views
0

Les erreurs suivantes pointent toujours vers ma liste.Liste C++ Unique() Fonction

Dans mon fichier de classe

Point3D operator==(const Point3D &p1) const; 

Dans mon fichier .cpp

bool operator==(Point3D &p1, Point3D &p2) 
{ 
    if (p1.getX() == p2.getX() && p1.getY() == p2.getY() && p1.getZ() == p2.getZ()) 
     return true; 
    else 
     return false; 
} 

Dans mon fichier principal

//declaration 
list<Point3D> l_3D; 

l_3D.unique(); <-- the error point to this 

Message d'erreur

..... In member function 'void std::list<_Tp,_Alloc>::unique() [with_Tp = Point3D,_Alloc = std:: allocator<Point3D>]: 

Instantiated from here 

error: could not convert 'Point3D::operator==(const Point3D&) const (((const Point3D&)((const Point3D*)__next. std::_List_iterator<_Tp>::operator*[with_Tp = Point3D]())))' to 'bool' 

Pour les âmes aimables là-bas, je vous remercie d'avance.

+1

Aussi, au lieu de 'if (some_bool_expression) renvoie true; else return false, ', il est plus idiomatique d'avoir' return some_bool_expression; ' –

+1

Cela me fait toujours frissonner quand les gens écrivent 'if (a) return true; sinon retournez faux; au lieu de simplement «retourner un». : -} –

Répondre

4

Dans votre déclaration, vous revenez Point3D, qui devrait être bool:

Point3D operator==(const Point3D &p1) const; 
^^^^^^^ 
should be bool 

Les regards ci-dessus comme vous déclarez l'opérateur en tant que membre fonction, pari alors vous le mettre en œuvre en fonction libre. Vous devez décider lequel c'est. Si vous utilisez un membre-fonction, changer la mise en œuvre à:

bool Point3D::operator==(const Point3D &p2) const 
{ 
    if (getX() == p2.getX() && getY() == p2.getY() && getZ() == p2.getZ()) 
     return true; 
    else 
     return false; 
} 

Ou encore mieux (comme par @ibids commentaire):

bool Point3D::operator==(const Point3D &p2) const 
{ 
    return (getX() == p2.getX() && getY() == p2.getY() && getZ() == p2.getZ()); 
} 

En général, la signature de votre définition devrait correspondre à la signature de votre déclaration.

+2

Aussi, c'est un mauvais style d'écrire 'if (...) return true; sinon, retournez faux; – ibid

1

Change:

bool operator==(Point3D &p1, Point3D &p2) 
{ 
    if (p1.getX() == p2.getX() && p1.getY() == p2.getY() && p1.getZ() == p2.getZ()) 
     return true; 
    else 
     return false; 
} 

à ceci:

bool operator==(const Point3D &p1, const Point3D &p2) 
{ 
    if (p1.getX() == p2.getX() && p1.getY() == p2.getY() && p1.getZ() == p2.getZ()) 
     return true; 
    else 
     return false; 
} 
+2

Lorsque vous utilisez cette méthode, vous devez écrire la déclaration en dehors de la déclaration de classe dans l'en-tête (comme 'class Point3D {}; extern bool operator == (const Point3D &, const Point3D &);'). – npclaudiu

0

Dans votre fichier de classe (je suppose que vous voulez dire un fichier d'en-tête), vous déclarez operator== que le retour Point3D quand il devrait être de retour bool. En outre, votre operator== a un nombre différent d'arguments dans votre fichier de classe (en-tête?) Et votre fichier cpp.