IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Surcharge d'operator, classe et global operateur


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 23
    Par défaut Surcharge d'operator, classe et global operateur
    bonjour, j'ai le problème suivant:
    Soit 2 classes Matrice et Vector dérivant des boost ublas matrix et vector.
    Pour permettre de comparer des objets Matrice et Vecteur entre eux mais également avec des constantes (une sorte d'element-wise operator), j'ai déclaré les operateurs suivant:

    Pour les Vecteurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Vector operator > (const Vector& roV);
    Vector operator < (const Vector& roV);
    Vector operator >= (const Vector& roV);
    Vector operator <= (const Vector& roV);
    friend Vector operator > (const Vector& roV, const double& roVal);
    friend Vector operator < (const Vector& roV, const double& roVal);
    friend Vector operator >= (const Vector& roV, const double& roVal);
    friend Vector operator <= (const Vector& roV, const double& roVal);
    Pour les Matrices:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Matrix operator > (const Matrix& roM);
    Matrix operator < (const Matrix& roM);
    friend Matrix operator > (const Matrix& roM, const double& roVal);
    friend Matrix operator > (const double& roVal, const Matrix& roM);
    friend Matrix operator < (const Matrix& roM, const double& roVal);
    friend Matrix operator < (const double& roVal, const Matrix& roM);
    friend Matrix operator >= (const Matrix& roM, const double& roVal);
    friend Matrix operator >= (const double& roVal, const Matrix& roM);
    friend Matrix operator <= (const Matrix& roM, const double& roVal);
    friend Matrix operator <= (const double& roVal, const Matrix& roM);
    Il y a les opérateur 'member' des classes et les opérateurs 'friend' pour permettre de coder indifféremment: 1.5 > Vecteur ou Vecteur > 1.5

    Mais sous VS'2008, à la compilation de:
    je reçois l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    error C2666: 'Vector::operator >' : 3 overloads have similar conversions
    could be 'Vector CMatlabVector::operator >(const Vector &)'
    or       'Matrix operator >(const Matrix &,const double &)'
    or       'Vector operator >(const Vector &,const double &)' [found using argument-dependent lookup]
    while trying to match the argument list '(Vector, int)'
    Je ne vois pas comment le compilateur aboutit à ça.... à ma connaissance il n'y a pas d'operateur de conversion implicite de 'int' en Vector ou Matrix.

    Est-ce que vous auriez une idée ?
    Merci d'avance.
    Alex.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    déjà, tes surcharges sont fausses.
    Les opérateurs que tu décris.. doivent retourner des bool. Il s'agit d'opérateur de comparaison.
    En corrigeant cette première erreur, peut-être que le message sera différent, voire corrigé.

    http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Par défaut
    Les opérateurs sont libres donc les paramètres sont interchangeable (lors d'un appel).

  4. #4
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 23
    Par défaut opérateur interchangeable ... +/-!!!
    les opérandes d'un opérateur sont "interchangeable" s' ils sont de même type... ou alors j'ai raté un truc!
    Si la class C surcharge l'opérateur + via
    ou via un friend
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C operator + (C& c1, C& c2)
    mais si on veut déclarer l'opération
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C + entier et entier + C
    dans ce cas il faut au minimum 1 surcharge de l'opérateur global.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C operator + ( int, C&)
    je me trompe ?

  5. #5
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par alex.buisson Voir le message
    Je ne vois pas comment le compilateur aboutit à ça.... à ma connaissance il n'y a pas d'operateur de conversion implicite de 'int' en Vector ou Matrix.

    Est-ce que vous auriez une idée ?
    Merci d'avance.
    Alex.
    Problème de constructeurs non explicit ?

    Si ta classe Vector possède un constructeur prenant un int en paramètre, et que le constructeur n'est pas déclaré explicit, alors tu as une conversion implicite int -> Vector.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Je ne pense pas que tous les opérandes soient interchangeables.
    Tout simplement parce que, oui a+b = b+a en général, mais a/b = b/a est le plus souvent (tout le temps ?) faux.
    De plus, tes opérateurs sont des opérateurs de comparaison, et mal écrits.
    Enfin il faudrait voir au moins les constructeurs disponibles pour en tirer une quelconque conclusion.
    Mais une chose dont je suis sûr : si le message d'erreur est là, c'est pour une bonne raison et il y a une explication logique, et un code faux.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 23
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Problème de constructeurs non explicit ?

    Si ta classe Vector possède un constructeur prenant un int en paramètre, et que le constructeur n'est pas déclaré explicit, alors tu as une conversion implicite int -> Vector.
    Merci c'est tout à fait ça j'avais raté ce point....
    Et je confirme les propos de @Bousk.... Tous les opérateurs de sont pas interchangeable ou plus précisément "commutatif"

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de surcharge d'operator<<
    Par Linu6 dans le forum C++
    Réponses: 11
    Dernier message: 14/06/2008, 13h17
  2. Architecture, Operator, classe abstraite
    Par neptune dans le forum C#
    Réponses: 2
    Dernier message: 03/06/2008, 11h30
  3. Abstract class (déclaration globale)
    Par choas dans le forum VB.NET
    Réponses: 4
    Dernier message: 05/02/2007, 20h27
  4. Réponses: 2
    Dernier message: 07/09/2006, 15h23
  5. Réponses: 2
    Dernier message: 15/11/2005, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo