2014-04-21 3 views
-3

Je suis un débutant en C++ et j'ai le problème suivant. Lorsque j'exécute le code suivant dans VS2013, j'obtiens une erreur.C++ operator << surcharge

class Y{ 
public: 
    Y(int un_x, int un_y) 
    : x_(un_x), y_(un_y) {} 

    int x() const { 
     return x_; 
    } 
    int y() const { 
     return y_; 
    } 
private: 
    int x_; 
    int y_; 
}; 
class X{ 
    private: 
     Y coord; 
    public: 
    // some code ... 

     Y position() const { 
      return coord; 
     } 

     void display(ostream& output) const { 
      output << "The object is in position " << position(); 
     } 
}; 




ostream& operator<<(ostream& output, Y x){ 
    output<< "(" << x.x() << ", " << x.y() << ")" << endl; 
    return output; 
} 

Si je crée un some_object objet de classe X et essayer de le faire:

cout << some_object ; 

Je reçois l'erreur followng:

error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const Y' (or there is no acceptable conversion) 
+0

Vous ne pouvez pas exécuter ce code car il n'y a pas de code à exécuter (comme une fonction principale). Si vous voulez dire ce dont vous avez parlé ci-dessous le code, il n'y a pas de surcharge pour sortir un 'X'. – chris

+1

Le code lié ci-dessus par MooingDuck se compile et s'exécute correctement sous VS2013. S'il vous plaît poster un [SSCCE] (http://sscce.org) qui reproduit le problème. – Praetorian

+2

En outre, qu'est-ce que 'X' a à voir avec cette question? –

Répondre

7

est l'opérateur << défini après vous essayer de l'utiliser - c'est après la fonction display()? Si oui, vous allez devoir soit le déplacer afin qu'il soit défini avant utilisation ou, à tout le moins, déclarer (c'est de fournir un prototype pour elle):

ostream& operator<<(ostream &output, Y x); 

En sidenote , vous devez passer l'instance Y par référence constante au lieu de la valeur par:

ostream& operator<<(ostream& output, Y const& x); 
+0

Eh bien, cela va m'apprendre à supposer que X était irrelevent: http://coliru.stacked-crooked.com/a/3e58bfe2f577ee43 :( –

+0

Exactement, maintenant ça marche, merci beaucoup –

+0

+1 J'ai vraiment besoin de commencez à lire les réponses avant de poster des commentaires si longs = P Réponse gentille – WhozCraig

0

vous ne la operator << surchargée pour la classe Y, vous ne surchargez pas pour la classe X. Donc, il ne peut pas en trouver un. Cela mis à part, vous devriez probablement passer Y dans l'opérateur par référence constante. Ceci est basé sur votre déclaration que vous avez essayé cout << some_objectsome_object était X. Si vous avez essayé some_object.display() vous pourriez encore rencontrer le problème décrit par un autre utilisateur.

Si cela était une faute de frappe, la réponse se déplace au lieu au poste de Nik, bien que je souligner à nouveau, vous devez passer par référence ou une référence constante

+0

Je ne vous downvote pas puisque la question manque de détails, mais probablement, puisqu'il est surchargé 'operator <<' pour 'Y', l'OP passe une instance de 'Y' et non' X' à 'operator <<'. – Praetorian

+0

@Praetorian mais il n'a pas lu la question et l'instruction juste avant celle qui a généré l'erreur – UpAndAdam

+0

Oups, évidemment je n'ai pas lu complètement la question non plus Excuses pour le commentaire précédent Mais vu le message d'erreur, il semble * qu'il * passe dans une instance de "Y" – Praetorian

0

vous obtenez cette erreur, car u n'ont pas déclaré ostream & opérateur < < (ostream & sortie, Y x) en fonction d'ami de Y. essayer de faire des cette fonction en fonction d'ami de Y comme X n'avez pas accès à deux votre fonction déclarée

ami ostream & opérateur < < (ostream & sortie, Y x);

+0

Pourquoi aurait-il besoin de faire ça? Il utilise seulement les fonctions publiques. Vous êtes incorrect. – UpAndAdam

+0

Vous en avez besoin car l'opérateur << pour Y n'est pas disponible pour X. et avec une fonction ami, il peut réaliser ce qu'il voulait. –

+0

Sauf que vous ne le faites pas. Il n'est pas défini comme un membre de la classe, il est disponible pour tout le monde, il est défini comme une fonction gratuite. Et en tant que tel, il utilise uniquement des méthodes de classe publique. – UpAndAdam