Problème de syntaxe (opérateur << enum dans class)

Résolu
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - Modifié le 3 févr. 2018 à 14:27
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 7 févr. 2018 à 16:19
Bonjour,

Bonjour,

J'ai un problème de syntaxe. En même temps la façon d'on je veux construire ma classe n'est peut être pas correcte... Mais je vois pas trop pourquoi...

Alors je veux déclarer une classe qui contient un enum public (jusque là tout vas bien).
Ajouter :
un opérateur << spécifique à mon enum histoire de pouvoir l'utiliser seul si ça m'éclate //<- c'est là que ça coince
et un opérateur << pour ma classe

Petite nuance, j'aimerais que mon opérateur spécifique soit DANS ma classe (pck j'aime bien :p).
Seconde nuance pas de ".h" (oui c'est pas super top mais c'est comme ça dans ce cas précis)

Donc je fait :
//###############################################################################################################################################
// CLASS EXEMPLE CODES SOURCES
//###############################################################################################################################################
//classe exemple
class cl_ExempleCS
{
//==================================================================================
// PUBLIC
//==================================================================================
public:
    //----------------------------------------
    //enum de type d'unité
    //----------------------------------------
    enum en_MonEnumeration
    {
        eME_NoDefine = -1,
     eME_Premier,
     eME_Second,
     // ...
    };
    //----------------------------------------
    // OPERATOR << de enum en_MonEnumeration
    //----------------------------------------
    std::ostream& operator << (std::ostream& O, enum en_MonEnumeration& ValEnum)
    {
        switch (ValEnum)
        {
            case veh_NoDefine:
                O << "NoDefine";
                break;
            case eME_Premier:
                O << "Premier";
                break;
            case eME_Second:
                O << "Second";
                break;
            default:
                O << "ERREUR !";
                break;
        }
        
        return O;
    }
//==================================================================================
// PRIVATE
//==================================================================================
private:
    enum en_MonEnumeration m_ValEnum;
    //...

//==================================================================================
// PUBLIC
//================================================================================== 
public:
    // ...
    //----------------------------------------
    // OPERATOR <<
    //----------------------------------------
    std::ostream& operator << (std::ostream& O)
    {
        O << "ValEnum=" <<  this->m_ValEnum <<  ";";
        // ...
        
        return O;
    }
};


Et mon compilo râle :

/tmp/######.cpp:50:80: error: ‘std::ostream& cl_ExempleCS::operator<<(std::ostream&, cl_ExempleCS::en_MonEnumeration&)’ must take exactly one argument
std::ostream& operator << (std::ostream& O, enum en_MonEnumeration& ValEnum)
^


Mais alors, comment je fait pour lui déclarer le type qu'il attend pour le 1er opérateur << ?

Merci d'avance :)
A voir également:

5 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 févr. 2018 à 11:21
Bonjour.

Ce que tu veux faire est compliqué. Il n'existe que deux signatures possibles pour operator<<, une avec un seul argument qui se met dans la classe, et une avec deux arguments qui se met en dehors d'une classe.
Un enum étant un entier, et vu qu'il n'est pas possible de redéfinir un operator pour un type pod, ce que tu veux faire est impossible.

Deux solutions, néanmoins:
  • Tu ne gardes que le operator<< interne à ta classe, et tu fournis une fonction print(ostream, ton_enum).
  • Tu fais une sous classe qui contient uniquement ton enum et un operator<< interne. Tu redéfinis le constructeur de copie, l'operator= et l'operator de conversion, pour passer d'un int à ta sous-classe interne. Ça fonctionnera, mais ça te fera un overhead sur ton enum...

0
Rejoignez-nous