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 :

‘std::ofstream’ has no member named ‘swap’ en C++11 ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Par défaut ‘std::ofstream’ has no member named ‘swap’ en C++11 ?
    Bonjour, j'ai un probleme de manipulation de stream.
    Voilà une partie du code :

    Pour le header (Driver.hh) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Driver{
    //Plein de trucs....
    // dont 
    void setFileIn(const std::string& filein); // Fait ce qu'elle doit faire pour le fichier de données.
    //.....
    public :
     
    std::string fileoutname;
    std::ostream& outstream = std::cout;
     
    Driver(const std::string& filein="",const std::string& fileout="");
     
    };
    Pour l'implementation (Driver.cc)
    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
     
    #include"Driver.hh"
    //plein de trucs...
    //......
     
    Driver::Driver(const std::string& filein/*=""*/, const std::string& fileout/*=""*/)
    {
      if(!filein.empty())
        {setFileIn(filein);}
      if(!fileout.empty())
        {
          std::ofstream tmp (fileout.c_str());
          tmp.swap(outstream);
        }
    }
    Je compile bien avec le standard C++11 justement pour swap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g++ -c -std=c++11 Driver.cc
    Et la première (mais pas la dernière !!) erreur du compilateur me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    In constructor ‘Driver::Driver(const string&, const string&)’:
    Driver.cc:64:11: error: ‘std::ofstream’ has no member named ‘swap’
           tmp.swap(outstream);
               ^
    Pourtant ici on me dit le contraire...

    Une idée ? (sur ce problème... ou sur une autre facon de faire, je suis preneur !)

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Bonjour,

    Quel version de GCC ? Il est probable que cette fonctionnalité n'ai pas été implémentée dans ta version, je ne sais plus où en est gcc, mais je crois que si niveau langage il est presque à 100% du C++11, niveau bibliothèque ce n'est pas le cas.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Par défaut
    j ai la 4.8.1...
    bon, j vais me reposer et j réfléchirai a ça plus tard.
    Merci en tout cas, je pensais que les compilateurs étaient prêts dès la 'sortie' des standards...
    Apparemment je n'ai pas bien compris comment les choses évoluent

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Qu'à partir de gcc-5.0.

    2 remarques:
    - fstream peut prendre un std::string, plus besoin de c_str().
    - swap s'applique sur un type équivalent. Ton code ne compilera pas car outstream est un ostream et tmp un ofstream.

    Tu peux regarder vers std::ostream::rdbuf, cela suffit peut-être ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Par défaut
    En fait j imagine que vous comprenez que je veux que la sortie soit au choix la sortie standard ou un fichier sans pour autant changer la variable qui represente cette sortie.
    J ai lu au sujet de rdbuf et ca a l air de pouvoir faire l affaire.
    si vous voyez un autre moyen de le faire ou si vous trouvez ma maniere de faire ridicule dites le moi svp.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Changer le buffer peut se faire.
    Il y a une autre possibilité, c'est d'utiliser un stream autre (genre BaygonV::out), que tu déclares comme tu en as besoin.

    Dernière possibilité, faire une redirection du flux de sortie standard (vers le fichier) non pas dans le programme mais à l'appel.
    ./programme >fichier
    Ainsi, le programme ne se pose pas la question, et si l'utilisateur veut intercaler un grep, un tee ou que sais-je encore, il peut le faire.

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/12/2011, 08h03
  2. [Compilation] Erreur : "has no member named"
    Par Trademark dans le forum Débuter
    Réponses: 8
    Dernier message: 03/05/2010, 22h11
  3. plantage std::ofstream impossible à récupérer ?
    Par Captain_JS dans le forum C++
    Réponses: 1
    Dernier message: 24/08/2007, 15h40
  4. structure has no mumber named 'annee'.
    Par moon93 dans le forum C
    Réponses: 30
    Dernier message: 02/08/2006, 17h11

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