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 :

[Langage] GCC 4.3 et redefinition operateur!= dans un namespace


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 19
    Points : 16
    Points
    16
    Par défaut [Langage] GCC 4.3 et redefinition operateur!= dans un namespace
    Bonjour,
    je suis entrain de migrer mon code sous gcc 4.3 (de 4.1 vers 4.3 passage à nouvelle distribution oblige) et j'ai une erreur de gcc que j'arrive pas à modifier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    namespace TOTO
    {
    class TOTO_API TITI
    {
       public:
      /// @name Constructors and destructor.
      //@{
      /// \brief Constructor of \ref TOTO::TITI "TITI" with all the parameters.
      TITI( const std::string& type,
                        const std::string& material,
                        bool visible ) ;
      /// \brief Destructor of \ref TOTO::TITI "TITI".
      virtual ~TITI() ;
      ///\brief Copy operator
      TITI& operator = ( const TITI& ref ) ;
      //@}
     
      /// @name Public member Type.
      //@{
    ...
      //@}
     
    protected:
      /// \brief Copy
      void _copy( const TITI& q ) ;
      /// @name Friend compare operators.
      //@{
      ///\brief Inequality operator for \ref TOTO::TITI "TITI".
      friend TOTO_API bool operator != ( const TITI& d0, const TITI& d1 ) ;
      ///\brief Equality operator for \ref TOTO::TITI "TITI".
      friend TOTO_API bool operator == ( const TITI& d0, const TITI& d1 ) 
        { return !( d0 != d1 ) ; }
      //@}
     
    } ;
     
    }
    et le cpp correspondant à l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //========================================================================
    // != operator
    bool TOTO::operator != ( const TOTO::TITI& d0, const TOTO::TITI& d1 )
    {
      return d0._type != d1._type
          || d0._material != d1._material
          || d0._visible != d1._visible ;
    }
    Et l'erreur :

    erreur : 'bool TOTO::operator!=(const TOTO::TITI&, const TOTO::TITI&)' should have been declared inside 'TOTO'


    Voilà si qq a une idée!!
    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    namespace TOTO
    {
     
    bool operator != ( const TITI& d0, const TITI& d1 )
    {
      return d0._type != d1._type
          || d0._material != d1._material
          || d0._visible != d1._visible ;
    }
     
    }
    ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 19
    Points : 16
    Points
    16
    Par défaut SMS + grossièreté
    Punaise bien joué !
    Par contre, bien evidemment j'ai redefini l'operateur == << >> Et par contre il accepte la syntaxe pour les autres...

    Quelqu'un a l'explication ?
    C'est pas super logique tout çà

    Merci

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par xabila Voir le message
    Punaise bien joué !
    Par contre, bien evidemment j'ai redefini l'operateur == << >> Et par contre il accepte la syntaxe pour les autres...

    Quelqu'un a l'explication ?
    C'est pas super logique tout çà

    Merci
    Salut,

    Les mots-clés sont "friend name injection". Le standard précise en effet que :
    Every name first declared in a namespace is a member of that namespace. If a friend declaration in a non-local class first declares a class or function the friend class or function is a member of the innermost enclosing namespace. The name of the friend is not found by simple name lookup until a matching declaration is provided in that namespace scope (either before or after the class declaration granting friendship). If a friend function is called, its name may be found by the name lookup that considers functions from namespaces and classes associated with the types of the function arguments (3.4.2). When looking for a prior declaration of a class or a function declared as a friend, and when the name of the friend class or function is neither a qualified name nor a template-id, scopes outside the innermost enclosing namespace scope are not considered.
    PS: gcc permet de contourner cette règle en utilisant -ffriend-injection mais je crois que cette option est destinée à disparaître ...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    je te conseille de mettre tout ton cpp dans le namespace qu'il faut, pour éviter les problèmes.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Bon bé merci les gars
    A la prochaine !

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

Discussions similaires

  1. [Langage] Surdefinition des operateurs dans c++
    Par angeless dans le forum Langage
    Réponses: 9
    Dernier message: 13/11/2008, 13h49
  2. Réponses: 2
    Dernier message: 11/03/2004, 15h20
  3. Réponses: 4
    Dernier message: 24/04/2003, 22h28
  4. [langage] Problème de taille de fichier à mettre dans
    Par And_the_problem_is dans le forum Langage
    Réponses: 10
    Dernier message: 13/08/2002, 09h41

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