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

C++ Discussion :

Fonction : Même prototype que std::cout


Sujet :

C++

  1. #21
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    C'est pas encore gagné...

    Si j'essaye sans le "endl", j'obtiens :
    undefined reference to 'Verbose operator<< <char[17]>(Verbose const&, char const (&) [17])'

    main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Verbose() << "Message niveau 0";
    Ma surcharge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template<typename T> friend Verbose operator<<(const Verbose &, const T &);
     
    template<typename T> Verbose operator<<(const Verbose & v, const T & t)
    {
          if(v.getMessageLevel() <= v.getVerboseLevel())
                std:cout << t;
          return v;
    }

  2. #22
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Retourne un const Verbose& déjà.
    Ensuite remplace template< class T > par template< typename T > ça te permettra de passer le std::endl.

    Undefined reference machin signifie qu'à l'édition des liens l'implémentation n'est pas trouvée.
    Le .cpp est bien lié ? Il n'y a pas de namespace dans l'affaire ?

    MAT.
    edit : ah c'est déjà fait le class -> typename dans la dernière version, au temps pour moi

  3. #23
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Undefined reference machin signifie qu'à l'édition des liens l'implémentation n'est pas trouvée.
    Le .cpp est bien lié ? Il n'y a pas de namespace dans l'affaire ?
    Non je n'ai pas de namespace et le .cpp est bien lié.

  4. #24
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Ah non mais pff, pas bien réveillé moi...

    Tu ne peux pas mettre l'implémentation dans le cpp vu que c'est template.

    MAT.

  5. #25
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Nickel je te remercie, ça fonctionne .

    Il me reste à gérer le "endl".

    Joe Dralliam m'a proposé de rajouter ceci :
    friend Verbose operator<<(const Verbose & verbose, std::ostream& (*t)(std::ostream&));
    En revenche, je ne sais pas comment l'implémenter.
    As tu une idée ?

  6. #26
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Je pense que ça fonctionne tel quel avec le template< typename T > au lieu du template< class T >.
    Essaye de remettre le << std::endl au bout pour voir.

    MAT.

  7. #27
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Oui, j'ai essayé mais ai une erreur de compilation :
    ../Test/main.cpp:9: erreur: no match for ‘operator<<’ in ‘operator<< [with T = int](((const Verbose&)((const Verbose*)operator<< [with T = char [2]](((const Verbose&)((const Verbose*)operator<< [with T = char [17]](((const Verbose&)((const Verbose*)(& Verbose(0)))), ((const char (&)[17])"message niveau 0")))), ((const char (&)[2])" ")))), ((const int&)((const int*)(&123)))) << std::endl’

  8. #28
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Ouais non ok, de nouveau au temps pour moi...

    Donc essaye ça du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    friend const Verbose& operator<<(const Verbose & verbose, std::ostream& (*t)(std::ostream&))
    {
        if(v.getMessageLevel() <= v.getVerboseLevel())
            std::cout << t;
        return verbose;
    }
    Comme suggéré précédemment.

    MAT.
    (et je vais me recoucher !)

  9. #29
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    C'est gagné !

    Merci beaucoup ça fonctionne !

    Voila la reponse complète :

    Verbose.h
    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
     
    class Verbose
    {
            private:
                    static int      _verboseLevel;
                    int             _messageLevel;
     
            public:
                                            Verbose(int messageLevel = 0);
                                            Verbose(const Verbose & source);
                    static void             setVerboseLevel(int verboselevel);
                    static int              getVerboseLevel();
                    void                    setMessageLevel(int messageLevel);
                    int                     getMessageLevel() const;
                    template<typename T> friend const Verbose &       operator<<(const Verbose & verbose, const T & t)
                    {
                            if(verbose.getMessageLevel() <= verbose.getVerboseLevel())
                                    std::cout << t;
     
                            return verbose;
                    }
                    friend const Verbose & operator <<(const Verbose & verbose, std::ostream& (*t)(std::ostream&))
                    {
                            if(verbose.getMessageLevel() <= verbose.getVerboseLevel())
                                    std::cout << t;
     
                            return verbose;
                    }
    };
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main(void)
    {
            Verbose::setVerboseLevel(1);
     
            Verbose(0) << "message niveau 0" << std::endl;
            Verbose(2) << "message niveau 2" << std::endl;
            Verbose(1) << "message niveau 1" << std::endl;
     
            return 0;
    }
    Sortie console
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    message niveau 0
    message niveau 1

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. std::cout codeblock même si je mets #include <iostream>
    Par emykev22 dans le forum Débuter
    Réponses: 7
    Dernier message: 15/07/2014, 16h47
  2. Passage d'une fonction en tant que paramètre
    Par bagnolm dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2006, 15h58
  3. [VS2005][C#] Construire une flèche du même genre que Visio
    Par pocket dans le forum Windows Forms
    Réponses: 11
    Dernier message: 16/03/2006, 09h33
  4. [XHTML] xhtml - Une division de même hauteur que le reste
    Par TommyWeb dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 11/02/2006, 18h31
  5. Comment fermer l'application en même temps que Windows ?
    Par semaj_james dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2004, 22h17

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