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

Langage C++ Discussion :

[vector]Des membres de vector "disparaissent" dans une classe template spécialisée


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut [vector]Des membres de vector "disparaissent" dans une classe template spécialisée
    Bonjour.

    Récemment, en compilant une classe, je me suis aperçu que le compilateur ne trouvait plus la méthode push_back d'un vector. La classe étant relativement compliquée et faisant appel à d'autres classes, j'ai décidé d'essayer d'en réécrire une autre et de reproduire le comportement... ce que je n'ai pas réussi à faire... mais j'ai par contre trouvé une autre erreur .

    Je soumet donc d'abord l'erreur de la classe simplifiée.

    Le code est le suivant:
    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
    //main.cpp
     
    //Classes de test
    #include <vector>
    template <class Membertype>
    class A
    {
      Membertype u;
      public:
      A(){}
      A(const Membertype & b):u(b){}
    };
    template <class Membertype>
    class B
    {
      private :
      B();
    };
    template <class Membertype>
    class B<A<Membertype> >
    {
      std::vector<A<Membertype> > members;
      public:
      B(){}
      B(const B &b):members(b.members){}
     
      size_t Add(const B &, const Membertype &);
     
    };
    template <class Membertype>
    size_t B<A<Membertype> >::Add(const B &b, const Membertype &U)
    {
      members.reserve(b.members.size()+1);
      members.push_back(A<Membertype>(U) );
    //[ERREUR]
      for(std::vector< A< Membertype> >::const_iterator it=b.members.begin();
        it!=b.members.end();++it)
    //[/ERREUR]
        members.push_back(*it);
      return members.size();
    }
     
     
    int main()
    {
      return 0;
    }
    et l'erreur du compilateur est:
    Citation Envoyé par gcc 4.4.1
    -------------- Build: Debug in stl_vector_test ---------------

    Compiling: main.cpp
    /.../main.cpp: In member function ‘size_t B<A<Membertype> >::Add(const B<A<Membertype> >&, const Membertype&)’:
    /.../main.cpp:36: error: expected ‘;’ before ‘it’
    /.../main.cpp:37: error: ‘it’ was not declared in this scope
    Process terminated with status 1 (0 minutes, 0 seconds)
    2 errors, 0 warnings
    L'erreur intervient donc ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(std::vector< A< Membertype> >::const_iterator it=b.members.begin();
        it!=b.members.end();++it)
    Comme si le const_iterator n'existait pas

    Voila pour la version simple.

    Pour la version compliquée je préfere donner un lien sur codepad (lisibilité oblige, le code n'étant pas scrollé).

    Voici le code (pour le permanence):
    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
    template <typename DisType, class Member>
    class EigMemberProps : public Member
    {
      protected:
      //Null if not set.
      DisType average_distance;
      DisType sum;
      DisType numentry;
     
     
      public:
      EigMemberProps();
      EigMemberProps(const Member & _m, DisType _d=0);
      EigMemberProps(const EigMemberProps<DisType,Member> & );
     
    };
     
     
    template <typename DisType, class Member>
    EigMemberProps<DisType,Member>::EigMemberProps()
      :Member(),average_distance(0),sum(0),numentry(0)
    {
    }
     
    template <typename DisType, class Member>
    EigMemberProps<DisType,Member>::EigMemberProps(const Member & _m, DisType _d)
      :Member(_m),average_distance(_d),sum(_d),numentry(_d==0?0:1)
    {
    }
     
    template <typename DisType, class Member>
    EigMemberProps<DisType,Member>::EigMemberProps
      (const EigMemberProps<DisType,Member> & _e)
      :Member(_e),average_distance(_e.average_distance),
      numentry(_e.numentry),sum(_e.sum)
    {
    }
     
    #include <vector>
     
    class CenteredFace
    {
    };
     
     
    template < class Props>
    class FaceBase
    {
      private:
      FaceBase();
    };
     
    template < class T,class U>
    class FaceBase<EigMemberProps<T,U> >
    {
      protected:
      std::vector< EigMemberProps<T,U> > members;
      public:
      size_t AddFace(const CenteredFace &,const U &);
     
    };
     
    template < class T,class U>
    size_t FaceBase<EigMemberProps<T,U> >::AddFace(const CenteredFace & C,const U &)
    {
    //[EREUR]
      members.push_back(EigMemberProps<T,U>(U) );
    //[/ERREUR]
      return (members.size()-1);
    }
     
    int main()
    {
      return 0;
    }
    Quand au message d'erreur complet, (sans le -Wfatal-errors) c'est celui-ci:
    Citation Envoyé par gcc 4.4.1
    -------------- Build: Debug in stl_vector_test ---------------

    Compiling: main.cpp
    /.../main.cpp: In member function ‘size_t FaceBase<EigMemberProps<T, U> >::AddFace(const CenteredFace&, const U&)’:
    /.../main.cpp:66: error: expected primary-expression before ‘(’ token
    /.../main.cpp:66: error: expected primary-expression before ‘)’ token
    Process terminated with status 1 (0 minutes, 0 seconds)
    2 errors, 0 warnings
    L'erreur intervient donc sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      members.push_back(EigMemberProps<T,U>(U) );
    ou il ne semble pas reconnaître le push_back...

    Si vous avez une idée sur l'origine de l'erreur ...

    Merci d'avoir lu le post jusqu'ici (il est relativement long ). J'espère que c'est une bêtise de ma part, mais depuis 2 jours, je suis bloqué sur cette erreur sans arriver à la résoudre

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    L'erreur intervient donc sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      members.push_back(EigMemberProps<T,U>(U) );
    ou il ne semble pas reconnaître le push_back...

    Si vous avez une idée sur l'origine de l'erreur ...
    Je pense plutôt qu'il attends une variable et non un type en tant que paramètre.

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    Bonjour.
    Citation Envoyé par méphistopheles Voir le message
    l'erreur du compilateur est:
    L'erreur intervient donc ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(std::vector< A< Membertype> >::const_iterator it=b.members.begin();
        it!=b.members.end();++it)
    Comme si le const_iterator n'existait pas
    ce n'est pas seulement au niveau de l'itérateur, si on place le code suivant dans Add :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::vector< A< Membertype> >::const_iterator T;
    cela produit l'erreur too few template-parameter-lists

  4. #4
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    typename. (cf FAQ et tout le toutim), pour le reste : cf la réponse de gl

  5. #5
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Vu que les erreurs de gcc sont souvent assez obscures dans du code fortement templaté, changer temporairement de compilateur est parfois très éclairant. Par exemple avec comeau online pour la version compliquée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "ComeauTest.c", line 67: error: type name is not allowed
        members.push_back(EigMemberProps<T,U>(U) );
                                              ^

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    A ce petit jeu là clang est vraiment pas mauvais (et il a le mérite d'être gratuit :p)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    main.cpp:67:41: error: 'U' does not refer to a value
    members.push_back(EigMemberProps<T,U>(U) );
                                          ^
    main.cpp:63:26: note: declared here
    template < class T,class U>
                             ^
    1 error generated
    rien à voir mais ça me fait toujours autant réver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    main.cpp:6:10: error: no template named 'vectr' in namespace 'std'; did you mean 'vector'?
        std::vectr<int> foo;
        ~~~~~^~~~~
             vector

  7. #7
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par gl Voir le message
    Je pense plutôt qu'il attends une variable et non un type en tant que paramètre.
    mais quel crétin... je pouvais même pas lui passer la variable en paramètre puisque je lui avais pas donné d'alias ><'. On va mettre ça sur le compte de la fatigue ...


    Citation Envoyé par bruno_pages Voir le message
    Bonjour.


    ce n'est pas seulement au niveau de l'itérateur, si on place le code suivant dans Add :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::vector< A< Membertype> >::const_iterator T;
    cela produit l'erreur too few template-parameter-lists
    Citation Envoyé par Goten Voir le message
    typename. (cf FAQ et tout le toutim), pour le reste : cf la réponse de gl
    Heuuu... y'a bien ça, mais je ne vois pas en quoi je fais un typename sur un template là puisque c'est sur un A<B> B étant bien défini de façon externe au typename...

    Pourrais-tu pointer l'article dont tu veux parler s'il te plais ?


    Citation Envoyé par Goten Voir le message
    A ce petit jeu là clang est vraiment pas mauvais (et il a le mérite d'être gratuit :p)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    main.cpp:67:41: error: 'U' does not refer to a value
    members.push_back(EigMemberProps<T,U>(U) );
                                                                              ^
    main.cpp:63:26: note: declared here
    template < class T,class U>
                             ^
    1 error generated
    rien à voir mais ça me fait toujours autant réver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    main.cpp:6:10: error: no template named 'vectr' in namespace 'std'; did you mean 'vector'?
        std::vectr<int> foo;
        ~~~~~^~~~~
             vector
    O_o j'avoue... je crois que je vais l'essayer ...

    Edit: il est pas dans les paquets et j'ai la flemme de le recompiler. On verra plus tard...

  8. #8
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Je répondais a Bruno_pages et donc à l'exemple simplifié . (puisque comme je l'avais dis gl avait déjà répondu à l'exemple "réel") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for( typename std::vector< A< Membertype> >::const_iterator it=b.members.begin();

    et la faq c'est :

    http://cpp.developpez.com/faq/cpp/?p...LATES_typename

  9. #9
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    ah oui, merci

  10. #10
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par Goten Voir le message
    Je répondais a Bruno_pages et donc à l'exemple simplifié . (puisque comme je l'avais dis gl avait déjà répondu à l'exemple "réel") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for( typename std::vector< A< Membertype> >::const_iterator it=b.members.begin();

    et la faq c'est :

    http://cpp.developpez.com/faq/cpp/?p...LATES_typename
    Elle veut pas rentrer celle là : j'ai fais exactement la même erreur il y a 11 jours ><'


    merci beaucoup

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

Discussions similaires

  1. vector dans une class
    Par squale69 dans le forum C++
    Réponses: 7
    Dernier message: 11/04/2008, 20h05
  2. créer automatiquement des membres dans une classe
    Par katebe dans le forum Windows Forms
    Réponses: 15
    Dernier message: 08/01/2008, 11h21
  3. [vbnet 1.1]Inserer deux simple quote sans texte dans une db
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/03/2007, 08h51

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