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 :

[STL] problème lors de l'utilisation de l'algorithme copy()


Sujet :

SL & STL C++

  1. #1
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut [STL] problème lors de l'utilisation de l'algorithme copy()
    Bonsoir,
    J'ai essayé de suivre les explication sur l'algorithme de Huffman (histoire de m'instruire d'avantage et de me perfectionner en C++)...
    j'ai voulu tester la cocherence d'une hierarchie de neuds, mais j'obtiens une erreur à la compilation:
    -------------- Build: Debug in Huffman ---------------
    Compiling: main.cpp
    C:/MinGW/include/c++/3.2.3/bits/ios_base.h: In copy constructor
    `std::basic_ios<char, std::char_traits<char> >::basic_ios(const
    std::basic_ios<char, std::char_traits<char> >&)':
    C:/MinGW/include/c++/3.2.3/bits/ios_base.h:424: `std::ios_base::ios_base(const
    std::ios_base&)' is private
    C:/Documents and Settings/U502136/Mes documents/C++/Huffman/main.cpp:13: within
    this context
    C:/Documents and Settings/U502136/Mes documents/C++/Huffman/main.cpp: In
    function `int main()':
    C:/Documents and Settings/U502136/Mes documents/C++/Huffman/main.cpp:13:
    initializing argument 3 of `_OutputIter std::copy(_InputIter, _InputIter,
    _OutputIter) [with _InputIter = std::_List_iterator<bool, bool&, bool*>,
    _OutputIter = std::basic_ostream<char, std::char_traits<char> >]'
    C:/MinGW/include/c++/3.2.3/bits/stl_algobase.h: In function `_OutputIter
    std::__copy(_InputIter, _InputIter, _OutputIter, std::input_iterator_tag)
    [with _InputIter = std::_List_iterator<bool, bool&, bool*>, _OutputIter =
    std::basic_ostream<char, std::char_traits<char> >]':
    C:/MinGW/include/c++/3.2.3/bits/stl_algobase.h:266: instantiated from `_OutputIter std::__copy_aux2(_InputIter, _InputIter, _OutputIter, __true_type) [with _InputIter = std::_List_iterator<bool, bool&, bool*>, _OutputIter = std::basic_ostream<char, std::char_traits<char> >]'
    C:/MinGW/include/c++/3.2.3/bits/stl_algobase.h:303: instantiated from `_OutputIter std::__copy_ni2(_InputIter, _InputIter, _OutputIter, __false_type) [with _InputIter = std::_List_iterator<bool, bool&, bool*>, _OutputIter = std::basic_ostream<char, std::char_traits<char> >]'
    C:/MinGW/include/c++/3.2.3/bits/stl_algobase.h:323: instantiated from `_OutputIter std::__copy_ni1(_InputIter, _InputIter, _OutputIter, __false_type) [with _InputIter = std::_List_iterator<bool, bool&, bool*>, _OutputIter = std::basic_ostream<char, std::char_traits<char> >]'
    C:/MinGW/include/c++/3.2.3/bits/stl_algobase.h:349: instantiated from `_OutputIter std::copy(_InputIter, _InputIter, _OutputIter) [with _InputIter = std::_List_iterator<bool, bool&, bool*>, _OutputIter = std::basic_ostream<char, std::char_traits<char> >]'
    C:/Documents and Settings/U502136/Mes documents/C++/Huffman/main.cpp:13: instantiated from here
    C:/MinGW/include/c++/3.2.3/bits/stl_algobase.h:227: no match for `++
    std::basic_ostream<char, std::char_traits<char> >&' operator
    C:/MinGW/include/c++/3.2.3/bits/stl_algobase.h:266: instantiated from `_OutputIter std::__copy_aux2(_InputIter, _InputIter, _OutputIter, __true_type) [with _InputIter = std::_List_iterator<bool, bool&, bool*>, _OutputIter = std::basic_ostream<char, std::char_traits<char> >]'
    C:/MinGW/include/c++/3.2.3/bits/stl_algobase.h:303: instantiated from `_OutputIter std::__copy_ni2(_InputIter, _InputIter, _OutputIter, __false_type) [with _InputIter = std::_List_iterator<bool, bool&, bool*>, _OutputIter = std::basic_ostream<char, std::char_traits<char> >]'
    C:/MinGW/include/c++/3.2.3/bits/stl_algobase.h:323: instantiated from `_OutputIter std::__copy_ni1(_InputIter, _InputIter, _OutputIter, __false_type) [with _InputIter = std::_List_iterator<bool, bool&, bool*>, _OutputIter = std::basic_ostream<char, std::char_traits<char> >]'
    C:/MinGW/include/c++/3.2.3/bits/stl_algobase.h:349: instantiated from `_OutputIter std::copy(_InputIter, _InputIter, _OutputIter) [with _InputIter = std::_List_iterator<bool, bool&, bool*>, _OutputIter = std::basic_ostream<char, std::char_traits<char> >]'
    C:/Documents and Settings/U502136/Mes documents/C++/Huffman/main.cpp:13: instantiated from here
    C:/MinGW/include/c++/3.2.3/bits/stl_algobase.h:228: no match for `*
    std::basic_ostream<char, std::char_traits<char> >&' operator
    Process terminated with status 1 (0 minutes, 1 seconds)
    13 errors, 0 warnings
    voici le code de ma fonction main (dans laquelle je teste mon algo):
    Code c++ : 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
    #include <iostream>
    #include "cnode.h"
    #include <algorithm>
     
    using namespace std;
    using namespace huffman;
    int main()
    {
        cNode * node = new cNode();
        node->setCaractere('a');
        cNode node2 = new cNode(node);
        list<bool> &code = * node->getCode();
        copy(code.begin(), code.end(), cout);
        cout << endl;
        return 0;
    }
    Je trouve étrange qu'il soir impossible à un constructeur de faire appelle à une fonction privée d'une même classe. Je me doute donc que ces erreurs en cachent d'autres. A quel momentme suis-je planté?
    Ancien membre du projet "Le Dernier Âge".

  2. #2
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    c'est normal que ton node2 ne soit pas un pointeur ?

  3. #3
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut
    Il faudrait voir plus en détail ta classe cNode. Y a-t-il un operateur de copie public ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    copy(code.begin(), code.end(), cout);
    Comment copies-tu des booléens dans std::cout ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    ca marchera mieux avec un iterator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    copy(code.begin(), code.end(), ostream_iterator<bool>(cout,"\n"));

  5. #5
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Citation Envoyé par blubz
    c'est normal que ton node2 ne soit pas un pointeur ?
    Oui, un oubli de ma part.

    Il faudrait voir plus en détail ta classe cNode. Y a-t-il un operateur de copie public ?
    Code :
    copy(code.begin(), code.end(), cout);
    Comment copies-tu des booléens dans std::cout ?
    Je me suis simplement contenté de suivre les exemples que j'avais vu, de l'utilisation de cette fonction présente dans la STL. Je suppose que le résultat est le même que lorsqu'on utilise un booléen a la suite d'un opérateur << sur cout (c'est à dire 0 pour false ou 1 pour true). Je me trompe peut être ceci dit.
    Pour ce qui est du constructeur par copie je n'en ai pas définit. Voici le code de ma classe cNode:

    cnode.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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #ifndef CNODE_H
    #define CNODE_H
     
    #include <list>
     
    namespace huffman {
     
        class cNode {
        private:
            cNode * _leftSideNode;
            cNode * _rightSideNode;
            std::list<bool> * _code;
            unsigned char _caractere;
            unsigned int _frequence;
     
        protected:
            void addCodePart(const bool & codePart);
            void popCodepart();
     
        public:
            cNode(cNode * left = NULL, cNode * right = NULL, const unsigned char & caractere = 0, const unsigned int & frequence = 0);
            virtual ~cNode();
     
            inline cNode * getLeftSideNode() const { return _leftSideNode; };
            inline cNode * getRightSideNode() const { return _rightSideNode; };
            void setLeftSideNode(cNode * node);
            void setRightSideNode(cNode * node);
     
            std::list<bool> * getCode() const { return _code; };
     
            inline unsigned char getCaractere() const { return _caractere; };
            inline void setCaractere(const unsigned char & caractere) { _caractere = caractere; };
            inline unsigned int getFrequence() const { return _frequence; };
            inline void setFrequence(unsigned int & frequence) { _frequence = frequence; };
        };
    };
     
     
     
    #endif // CNODE_H
    cnode.cpp
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include "cnode.h"
    #include <cassert>
     
    namespace huffman {
     
        cNode::cNode(cNode * left,
            cNode * right,
            const unsigned char & caractere,
            const unsigned int & frequence) :
            _leftSideNode(left),
            _rightSideNode(right),
            _caractere(caractere),
            _frequence(frequence)
        {
            if (_leftSideNode != NULL) {
                _leftSideNode->addCodePart(false);
            }
            if (_rightSideNode != NULL) {
                _rightSideNode->addCodePart(true);
            }
            _code = new std::list<bool>();
        }
     
        cNode::~cNode()
        {
            if (_leftSideNode != NULL) {
                delete _leftSideNode;
            }
            if (_rightSideNode != NULL) {
                delete _rightSideNode;
            }
            delete _code;
        }
     
        void cNode::addCodePart(const bool & codePart) {
            _code->push_front(codePart);
            if (_leftSideNode != NULL) {
                _leftSideNode->addCodePart(codePart);
            }
            if (_rightSideNode != NULL) {
                _rightSideNode->addCodePart(codePart);
            }
        }
     
        void cNode::setLeftSideNode(cNode * node) {
            if (_leftSideNode != NULL && _leftSideNode != node) {
                _leftSideNode->popCodepart();
            }
            if (_leftSideNode != node) {
                _leftSideNode = node;
            }
            if (_leftSideNode != NULL) {
                _leftSideNode->addCodePart(false);
            }
        }
     
        void cNode::setRightSideNode(cNode * node) {
            if (_rightSideNode != NULL && _rightSideNode != node) {
                _rightSideNode->popCodepart();
            }
            if (_rightSideNode != node) {
                _rightSideNode = node;
            }
            if (_rightSideNode != NULL) {
                _rightSideNode->addCodePart(true);
            }
        }
     
        void cNode::popCodepart() {
            _code->pop_front();
            if ( _leftSideNode != NULL ) {
                _rightSideNode->popCodepart();
            }
            if ( _rightSideNode != NULL ) {
                _leftSideNode->popCodepart();
            }
        }
    }
    Ancien membre du projet "Le Dernier Âge".

  6. #6
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Citation Envoyé par alskaar
    ca marchera mieux avec un iterator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    copy(code.begin(), code.end(), ostream_iterator<bool>(cout,"\n"));
    Effectivement ça marche mieux comme ça j'ai du me planter en lisant la doc. Merci beaucoup (je n'avais pas lu ton message hier soir).
    Ancien membre du projet "Le Dernier Âge".

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

Discussions similaires

  1. Réponses: 27
    Dernier message: 25/10/2006, 12h10
  2. problème lors de l'utilisation de mon application
    Par dododi dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/10/2006, 19h35
  3. Réponses: 3
    Dernier message: 16/08/2006, 10h26
  4. Problème lors de l'utilisation de opennreport
    Par willytito dans le forum Access
    Réponses: 1
    Dernier message: 20/07/2006, 21h00
  5. Problème lors de l'utilisation de FOP
    Par llaurentt dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 12/05/2006, 15h49

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