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 :

Recherche méthode paliative au bug connu GCC (Constructeur ostream non movable)


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Developpeur / Technicien support
    Inscrit en
    Février 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur / Technicien support
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 30
    Points : 11
    Points
    11
    Par défaut Recherche méthode paliative au bug connu GCC (Constructeur ostream non movable)
    Bonjour,

    Voici mon problème en quelques lignes.

    Je reprend actuellement un projet dans mon entreprise qui a pour but de modifier le logiciel existant afin qu'il puisse s’exécuter sur une librairie à jour car il a été créer avec la librairie C++ STL SGI, qui n'est plus utilisée aujourd'hui.

    Voici mon bout de code posant problème, les points importants sont indiqués en gras

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void make_xml (ostream & out, LISP_Atom * expr)
    {
      int top_error = error_in_IC.front ();
      xmlout = out;
      __lisp_disp_dblquote = 0;
      if (expr == NULL)
        return;
      if (expr->type () != liste) {
        expr->out (xmlout, 1);
        return;
      }
    Erreur retournée par GCC 4.6.1 c++0x.


    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
    In file included from /usr/include/c++/4.6/iostream:40:0,
                     from lisp.h:11,
                     from lisp2xml.h:6,
                     from lisp2xml.cpp:1:
    /usr/include/c++/4.6/ostream:57:11: erreur: 'std::basic_ostream<char>& std::basic_ostream<char>::operator=(const std::basic_ostream<char>&)' is implicitly deleted because the default definition would be ill-formed:
    /usr/include/c++/4.6/ostream:57:11: erreur: use of deleted function 'std::basic_ios<char>& std::basic_ios<char>::operator=(const std::basic_ios<char>&)'
    In file included from /usr/include/c++/4.6/ios:45:0,
                     from /usr/include/c++/4.6/ostream:40,
                     from /usr/include/c++/4.6/iostream:40,
                     from lisp.h:11,
                     from lisp2xml.h:6,
                     from lisp2xml.cpp:1:
    /usr/include/c++/4.6/bits/basic_ios.h:64:11: erreur: 'std::basic_ios<char>& std::basic_ios<char>::operator=(const std::basic_ios<char>&)' is implicitly deleted because the default definition would be ill-formed:
    /usr/include/c++/4.6/bits/ios_base.h:791:5: erreur: 'std::ios_base& std::ios_base::operator=(const std::ios_base&)' is private
    /usr/include/c++/4.6/bits/basic_ios.h:64:11: erreur: à l'intérieur du contexte
    C'est un bug connu par les dév GCC : http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54316

    Malheureusement je ne vois pas de méthode palliative mise en place pour aider à corriger ce bug faisant partie intégrante de la librairie Standard.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    2 solutions me viennent rapidement à l'esprit, mais une seule me semble réellement satisfaisante :

    1) Faire de xmlout un pointeur sur ostream et lui affecter l'adresse de out (il faudra faire attention à la durée de vie de l'objet pointé).

    2) (la meilleure je pense) Faire une classe qui hérite de ostream et pourquoi pas le faire hériter aussi du pattern prototype de manière à rendre la nouvelle classe clonable (d'une certaine manière copiable). Mais avant de faire n'importe quoi, je pense qu'il faudrait déja que tu te renseignes sur la raison pour laquelle ostream n'est pas copiable.

  3. #3
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 765
    Points
    765
    Par défaut
    std::ostream est une classe abstraite qui "cache" l'implémentation réelle du flux (std::ofstream, std::ostringstream, ...), ça n'a pas de sens d'en faire une copie, et ce n'est pas pour rien que le constructeur de copie est déclaré delete. J'ai plutôt l'impression que tu cherches juste à changer la variable pointée par une référence après son initialisation, ce qui est interdit en C++ (et sûrement pas un bug de GCC, le rapport que tu cites n'a malheureusement rien à voir ).

    Si cette référence doit changer tout le temps, alors tu peux utiliser la solution 1) postée par backlash. Si elle ne doit être définie qu'une fois, alors tu devrais plutôt te débrouiller pour passer ce std::ostream& out au constructeur de ta classe, et l'assigner à la référence xmlout dans la liste d'initialisation une fois pour toute.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Dans le pire des cas, tu pourrais même envisager une solution dérivée de cette entrée de la FAQ:
    1- Créer une classe (héritée de std:: ofstream) qui "pique" le buffer d'un autre fllux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class OutputStream : public std::ostream{
        public:
            OutputStream(std::ostream & os){
                rdbuf(os.rdbuf());
            }
    };
    2- s'arranger pour que le flux dont on prend le buffer soit transmis à la classe qui va l'utiliser sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class XmlWriter{
        public:
            XmlWriter(std::ostream & os):out(os){}
            void write(/* ... */{
                /* écrit toutes les données reçues en paramètre */
            }
       private:
           OutputStream out;
    };
    3- utiliser cette classe sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(){
       /* cela fonctionne avec un fichier ;) */
       std::ofstream ofs("data.xml");
       XmlWriter toFile(ofs);
       toFile.write(/* les paramètres "qui vont bien"  */);
       /* mais aussi avec la sortie standard */
       XmlWriter toStandard(std::cout);
       toStandard.write(/* les paramètres "qui vont bien" */);
    }
    En créant une classe "InputStream" héritée de std:: istream ainsi qu'une classe "Reader" et en remplaçant les flux de sortie par des flux d'entrée, tu sera en mesure de récupérer les données de n'importe quel flux

  5. #5
    Membre à l'essai
    Homme Profil pro
    Developpeur / Technicien support
    Inscrit en
    Février 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur / Technicien support
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 30
    Points : 11
    Points
    11
    Par défaut
    Merci pour votre aide la solution 1 fonctionne parfaitement, je clôture le sujet

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

Discussions similaires

  1. [TFS] Bugs connu
    Par despeludo dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 28/10/2007, 00h39
  2. Recherche méthode pour remplacer caracteres illegaux
    Par Attila50 dans le forum Général Java
    Réponses: 19
    Dernier message: 20/12/2006, 17h13
  3. Réponses: 14
    Dernier message: 17/11/2006, 19h17
  4. Recherche méthode pour formater une chaine pour JS
    Par mittim dans le forum Langage
    Réponses: 1
    Dernier message: 05/09/2006, 10h04
  5. Recherche fausse select à cause bug ie des div
    Par laurent_h dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 05/05/2006, 00h07

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