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 :

Flux de fichiers. Erreur dans le constructeur de copie


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Flux de fichiers. Erreur dans le constructeur de copie
    Bonjour,

    Je tente d'écrire des données dans un fichier tout se passe bien sauf quand je tente d'afficher un objet complexe.

    L'idée de mon code est de prodécer à l'affichage d'un objet assez complexe de type "graphGrammar". Cet objet comporte entre autre un vector<CDart> appelé rules.
    CDart lui même comporte plusieurs attributs, c'est pourquoi je me suis dit que j'allais créer une première fonction principale "printRules" qui afficherait un certain nombre d'attributs et qui appellerait elle même "printFace" qui s'occuperait de l'affichage des CDarts.

    Ci-dessous le prototype de la fonction printRule et printFace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void printRules(GraphGrammar, string);
    void printFace(vector<CDart>, ofstream);
    Code de printRules :
    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
     
    void printRules(GraphGrammar g, string filename){
     
        ofstream fichier(filename.c_str(), std::ios::out | std::ios::ate); 
     
        if(fichier)  // si l'ouverture a réussi
        {
    	unsigned int i = 0;
    	while(i < g.getRules().size()){
    	    fichier << "Regle n° " << i << ":" << endl;
    	    fichier <<  printFace(g.getRule(i).antecedent, fichier) << endl;
                i++;
             }
             fichier.close(); 
        }
    L'erreur que j'obtient est la suivante :
    /usr/include/c++/4.6/bits/ios_base.h: In copy constructor ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’:
    /usr/include/c++/4.6/bits/ios_base.h:788:5: erreur: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
    J'ai cru comprendre qu'il attendait que je lui passe un "const ostream" en paramètre lors de l'appel de printFace, mais visiblement j'ai mal compris puisque cela ne résoud rien.

    Toute aide est la bienvenue, merci d'avance !

  2. #2
    Membre régulier Avatar de GrosLapin
    Homme Profil pro
    Ingénieur et Etudiant
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur et Etudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 85
    Points
    85
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void printFace(vector<CDart>, ofstream);
    Tu fais un passage par copie, donc il tente de crée un objet de type ofstream avec le constructeur par défaut... et ça a pas l'aire de lui plaire xD

    Avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void printFace(vector<CDart>, ofstream& );
    ça devrait être mieux

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Merci pour l'aide, effectivement la correction a levée cette erreur !

    En revanche, maintenant j'ai une erreur à la ligne ou j'appelle printFace :
    erreur: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>]((* & fichier.std::basic_ofstream<char>::<anonymous>), ((const char*)"Antecedant :")) << printFace(std::vector<Map2d::CDart>((*(const std::vector<Map2d::CDart>*)(& GraphGrammar::getRule(int)(((int)i)).Rule::antecedent))), (* & fichier))’
    Je me suis dit que peut être l'erreur venait de l'attribut passé en paramètre. J'ai donc fait le test en ajoutant juste avant un object "blabla" de type vector<CDart>, et j'obtient exactement le même message :

    erreur: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>]((* & fichier.std::basic_ofstream<char>::<anonymous>), ((const char*)"Antecedant :")) << printFace(std::vector<Map2d::CDart>((*(const std::vector<Map2d::CDart>*)(& blabla))), (* & fichier))’
    L'étonnant pour moi c'est que à la ligne d'avant j'affiche déjà un attribut "simple" avec l'opérateur "<<" sans passer par printFace et que cela ne me lève pas d'erreur...

    Un complément d'aide serait il possible ?

  4. #4
    Membre régulier Avatar de GrosLapin
    Homme Profil pro
    Ingénieur et Etudiant
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur et Etudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par fred94190 Voir le message
    Un complément d'aide serait il possible ?
    Non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void printFace(vector<CDart>, ofstream& );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fichier <<  printFace(g.getRule(i).antecedent, fichier) << endl;
    Pour moi tu tente de lui faire faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fichier << Quelque chose qui retourne VOID ! << endl;
    Et ça a pas l'aire de lui plaire

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    EDIT : Merci, effectivement je n'avais tout simplement pas pensé que le contenu entre mes 2 paires de "<<" allait être vide !

    Problème résolu !

  6. #6
    Membre régulier Avatar de GrosLapin
    Homme Profil pro
    Ingénieur et Etudiant
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur et Etudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 85
    Points
    85
    Par défaut
    Tu peux retourner quelque chose (string par exemple) mais rien t'y oblige.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if(fichier)  // si l'ouverture a réussi
        {
    	unsigned int i = 0;
    	while(i < g.getRules().size()){
    	    fichier << "Regle n° " << i << ":" << endl;
    	   printFace(g.getRule(i).antecedent, fichier);
               fichier << endl;
                i++;
             }
             fichier.close(); 
        }
    Et comme ta fonction printFace prend un ofstream& tu peux très bien faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void printFace(vector<CDart> vec, ofstream fichier)
    {
        // ton traitement 
        fichier << "ton affichage" ; 
    }

  7. #7
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier <<  printFace(g.getRule(i).antecedent, fichier) << endl;
    Je suppose que ta fonction printFace qui prend un ostream& en argument écrit directement dans ce flux. Donc tu n'as pas besoin de faire fichier << QUELQUE CHOSE puisque c'est exactement ce qui est fait à l'intérieur de ta fonction.

    Contente toi d'appeler ta fonction tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printFace(g.getRule(i).antecedent, fichier);
    Edit: doublon avec la réponse ci dessus

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

Discussions similaires

  1. Erreur dans le constructeur
    Par rimbaut dans le forum Langage
    Réponses: 7
    Dernier message: 14/02/2010, 12h13
  2. Erreur sur mon constructeur par copie
    Par beegees dans le forum C++
    Réponses: 8
    Dernier message: 02/04/2008, 20h58
  3. Erreur dans un fichier Yacc
    Par gRaNdLeMuRieN dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 20/08/2005, 20h50
  4. Réponses: 6
    Dernier message: 02/06/2005, 12h44
  5. [Servlet] Erreur dans le fichier web.xml
    Par Crazyblinkgirl dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 05/07/2004, 15h20

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