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

SL & STL C++ Discussion :

std::endl c'est quoi ??


Sujet :

SL & STL C++

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    Par défaut std::endl c'est quoi ??
    bonjour, voila j'ai surchagé l'operator << comme ceci (enfin c'est pas exactement moi...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     template<class T>CMyClass& operator<<(const T& T){
       					std::ostringstream oss;
        				oss << T;
        				write(oss.str());
    					return *this;
    			}
    tout ceci fonctionne bien, pour des string char[] , int, etc..Etc..
    mais lorsque je fait

    CMyclass A;
    A << "bonjour << std::endl;
    il ne compile plus et me met ce beau msg.


    elekis@ubuntu:~/stuff$ g++ -o test main.cc
    main.cc: In function 'int main()':
    main.cc:6: error: no match for 'operator<<' in '(+(+ CCoutLogger::Instance())->CLogger::operator<< [with T = char [9]](((const char (&)[9])"bonjour ")))->CLogger::operator<< [with T = int](((const int&)((const int*)(&5)))) << std::endl'
    si c'est pas un objet, si c'est pas un string, c'est quoi???


    et surtout comment fairepour qu'il soit accepté ??

    merci

    a++

  2. #2
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut
    Il me semble en fait que tu n'utilises pas dans le bon sens la surcharge...
    Je m'explique : quand tu surcharges "operator<<" tu surcharges l'opérateur de flux standard de sortie...
    Donc c'est à utiliser avec cout !!

    Du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CMyClass A;
    cout<<A<<std::endl;
    En fait la surcharge est faite pour justement manipuler les CMyClass comme un int ou autre... Or tu ne fais pas un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int a;
    a<<"2"<<std::endl;
    A+

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    C'est une fonction prenant en paramètre le flux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <class charT, class traits>
      basic_ostream<charT,traits>& endl ( basic_ostream<charT,traits>& os );
    Pour pouvoir la passer à ta classe, il faut donc avoir une surcharge de << prenant en paramètre ce type de fonction, et ne faisant que l'appeler avec en paramètre le flux. Ce qui ne servirait à rien, puisque tout ce que tu vas pouvoir reléguer à write ce sont des chaînes.

    Personnellement j'ai juste remplacé les std::endl par des "\n". Parce que si tu commences à écrire une surcharge pour chaque manipulateur, ça va t'en faire un paquet.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il me semble en fait que tu n'utilises pas dans le bon sens la surcharge...
    Je m'explique : quand tu surcharges "operator<<" tu surcharges l'opérateur de flux standard de sortie...
    Donc c'est à utiliser avec cout !!
    Non, là il code bien une classe se comportant comme un flux (un logger si j'ai bien suivi), à mettre donc de l'autre côté de l'opérateur <<.

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    Par défaut
    en fait, c'et le tient.(inspiré) :-)

    mais je viens de decouvrir
    http://loulou.developpez.com/tutorie...artie4_src.zip

    et en fiat, c'est exact, tu fait << "\n" je crois que c'est plus simple tu as raison


    merci

    a+++

  6. #6
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut
    Citation Envoyé par Loulou24
    Non, là il code bien une classe se comportant comme un flux (un logger si j'ai bien suivi), à mettre donc de l'autre côté de l'opérateur <<.
    Ok, je ne savais pas, j'ai jamais utilisé comme ça avant...

    A+

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Le type de std::endl est (on s'accorche...)
    template <class charT, class traits>
    basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);

    Donc, en gros, c'est une fonction... Etonnant non...

    Maintenant, pous quoi faire veux-tu redéfinir les opérateurs de flux ? Si en fait, tu veux une classe qui te permettre d'écrire ailleurs que dans ce que propose la SL par défaut, ce n'est pas ainsi qu'il faut procéder.

    Les flux sont fait de eux parties : stream, qui s'occupent de la mise en forme, et stream_buffer qui s'occcupent de où lire/écrire. Un ofstream n'est rien d'autre qu'un ostream qui écrit dans un filebuf au lieu d'un simple streambuf.

    Donc, si tu veux écrire ailleurs, il suffit de dériver ton propre streambuf du la classe de base, de redéfinir 2/3 fonctions virtuelles, et c'est joué. Un exemple est fourni sur http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/#flux_entree_sortie (§27.3)

  8. #8
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    Par défaut
    merci, mais comme le disait loulou, je voulais betement faire un log pour pouvoir ecrire un truc du genre

    CLOG << "bonjour" << "\n"


    etc..Etc..

    donc je ne vais pas tout redefinir (meme si ca a l'air un bon exo) un simple << "\n" me convient bien

    mùerci

    a++

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si vraiment tu t'en moques, des pertes en performances et en fonctionnalités de cette solution (ce qui peut être étrange pour un logger), rien ne t'empêche de pouvoir utiliser endl, il te suffit pour ça d'ajouter un surcharge du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <class T> ILogger& operator<<(T& (*pf)(T&))
    {
        std::ostringstream Stream;
        Stream << pf;
        Write(Stream.str());
        return Log();
    }
    Remarque : Ici, tu aura le retour à la ligne, puisque ça peut se traduire dans un string, mais par exemple le flush flushera Stream, ce qui est de peu d'intérêt pour toi. De même, les autres manipulateurs qui ont pour but de modifier l'état d'un stream modifierons celui d'un stream temporaire, il est donc impossible avec cette classe de mettre en forme ce qu'on log.

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

Discussions similaires

  1. [sbadecoder a dit].. C'est quoi pour vous un beau programme?
    Par seb.49 dans le forum Langages de programmation
    Réponses: 14
    Dernier message: 13/02/2004, 10h41
  2. c'est quoi un 'system catalogs' ...
    Par jaimepasteevy dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 08/12/2003, 16h47
  3. C'est quoi XMLRAD ?
    Par laffreuxthomas dans le forum XMLRAD
    Réponses: 10
    Dernier message: 09/08/2003, 02h42
  4. C'est quoi "Profile" dans le assign du XMLGram ?
    Par Lux interior dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/02/2003, 11h37
  5. C'est quoi exactement un générateur d'états
    Par Henry Cesbron Lavau dans le forum Outils de restitution et d'analyse
    Réponses: 0
    Dernier message: 02/04/2002, 19h15

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