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 :

Fonction template, erreur interne du compilateur


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Fonction template, erreur interne du compilateur
    Bonjour,

    Je suis assez peu familier avec les template et je me retrouve confronté à un problème :

    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
     
    .h 
     
    template<class DT> class PP2DCID_Data : public PP2DCID_BaseData
    {
         public:
              PP2DCID_Data(PP2DCID_Element* pce, PP2DCID_Id I) : PP2DCID_BaseData(pce,I){};
              bool Read(TStream*);
              inline DT* GetData() { return &dt; };
     
         private:
              DT dt;
    };
     
    class PP2DCID_MultiData : public PP2DCID_BaseData
    {
         public:
              PP2DCID_MultiData(PP2DCID_Element* pce, PP2DCID_Id I):  PP2DCID_BaseData(pce,I){};
              virtual ~PP2DCID_MultiData();
              virtual bool Read(TStream* ps)=0;
     
         protected:
              unsigned int uiN; 
              vData Datas;
              template<class DT> PP2DCID_Data<DT>* MandatoryGet(TStream* ps);
     
    };
     
    .cpp
     
    template<class DT> PP2DCID_Data<DT>* PP2DCID_MultiData::MandatoryGet(TStream* ps)
    {
         PP2DCID_Data<DT>* pDDT;
     
         pDDT = dynamic_cast<PP2DCID_Data<DT>* > (CreateElement(ps));
         if (!pDDT) throw Exception("Other Data Type expected");
     
         return pDDT;
    }
    Voilà le code tel qu'il est réellement. Il n'est évidement pas entier et je peux rajouter les parties qui manquent si cela est utile.

    J'ai C++ builder 5. La compilation meurt sur la ligne du fichier .cpp "template<class DT> PP2DCID_Data<DT>* PP2DCID_MultiData::MandatoryGet(TStream* ps)"
    L'erreur reportée est "[C++ Erreur fatale] Format_PP2D_CID.cpp(692): F1004 Erreur du compilateur interne at 0x128a12c with base 0x1200000".

    Si quelqu'un pouvait m'aider...

    Merci.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Une erreur interne est un bug du compilateur. Parfois il arrive qu'en ré-écrivant différemment la partie du code concernée, cela résolve le problème. Sinon il faut changer de compilateur.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    2 pistes :
    1/ essaies de définir ta méthode dans la déclaration de la classe (dans le .h)
    2/ Testes ton code avec un autre compilateur. Peut-être celui-ci ne crashera pas mais te sortira des erreurs plus explicites sur un problème d'écriture de ton code.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci à vous deux.

    Il me semblait aussi que c'était une mauvaise implémentation du standard C++, mais comme je l'ai dit, je ne suis pas au top avec les template et je doutais un peu de la validité de la syntaxe que j'ai employée (syntaxe peu évidente, il faut bien le dire, contrairement au reste du C++).

    Changer de compilateur, même à des fins de tests, est simplement inconcevable avec ce programme écrit en C++ builder. Il y a bien trop de choses qui lui sont propres (TStream, AnsiString, ...). C'est vrai que c'est beaucoup mieux de ce point de vue quand on écrit en C++ standard, mais c'est tellement plus long...

    L'erreur a disparue en déplaçant l'implémentation de la fonction template incriminée dans le .h. Cela a le mérite de fonctionner même si ce n'est pas satisfaisant intellectuellement parlant. Mais bon, les programmes ne sont pas que de la théorie.

    Merci encore.

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    T'avais séparé définition et déclaration? (dans un .hpp et un .cpp ???)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    L'erreur a disparue en déplaçant l'implémentation de la fonction template incriminée dans le .h. Cela a le mérite de fonctionner même si ce n'est pas satisfaisant intellectuellement parlant. Mais bon, les programmes ne sont pas que de la théorie.
    Il faut mettre l'implémentation des templates dans le .h. Il y a un autre fil sur le forum là-dessus, et une entrée dans la FAQ .

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Il faut mettre l'implémentation des templates dans le .h. Il y a un autre fil sur le forum là-dessus, et une entrée dans la FAQ .
    Oui, je l'ai lu et connais à peu près la problématique. Mais les choses ne sont pas si évidentes.

    J'ai un fait programme sous g++ / linux qui fonctionne parfaitement avec une classe template implémentée séparément (du moment que l'on inclus le .cpp et non le .h, si ma mémoire est bonne). Par ailleurs, j'ai, dans le reste de l'unité dont je parlais en C++ builder, des classes et des fonctions template qui marchent parfaitement malgré qu'elles ne soient pas implémentées dans le .h. Cela dépend grandement du compilateur et... De choses que je ne maîtrise apparemment pas.

    Le fait est que je trouve que l'implémentation de fonctions dans le .h est crade même si c'est parfois pratique pour les fonctions courtes (inline notamment). Je préfère éviter dans la mesure du possible.

    Au fond, une simple question d'habitudes et d'esthétique.

  8. #8
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Le fait est que je trouve que l'implémentation de fonctions dans le .h est crade même si c'est parfois pratique pour les fonctions courtes (inline notamment). Je préfère éviter dans la mesure du possible.
    Je comprends le point de vue, même si je ne le partage pas (en C++, je sépare car il faut, mais en C#, je regroupe et ça me convient très bien).

    Au fond, une simple question d'habitudes et d'esthétique.
    Pas uniquement. Si tu mets les implémentations des templates dans les .cpp, tu vas au devant de problèmes, donc, autant ne pas le faire.

    Si tu tiens à les séparer, mets les plutôt dans un .impl, que tu inclus en bas du .h, par exemple. Inclure des .cpp, c'est très mal .

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Emiler Voir le message
    Oui, je l'ai lu et connais à peu près la problématique. Mais les choses ne sont pas si évidentes.

    J'ai un fait programme sous g++ / linux qui fonctionne parfaitement avec une classe template implémentée séparément (du moment que l'on inclus le .cpp et non le .h, si ma mémoire est bonne). Par ailleurs, j'ai, dans le reste de l'unité dont je parlais en C++ builder, des classes et des fonctions template qui marchent parfaitement malgré qu'elles ne soient pas implémentées dans le .h. Cela dépend grandement du compilateur et... De choses que je ne maîtrise apparemment pas.

    Le fait est que je trouve que l'implémentation de fonctions dans le .h est crade même si c'est parfois pratique pour les fonctions courtes (inline notamment). Je préfère éviter dans la mesure du possible.

    Au fond, une simple question d'habitudes et d'esthétique.
    Il suffit que l'unité de compilation aie en même temps la déclaration et la définition au moment où elle est compilée. En général, on fait quand même une séparation entre la déclaration et la définition. A la différence des autres classes, cette dernière n'est pas compilée séparément mais insérée à la fin de la déclaration. :
    mon_templ.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<class T>
    struct mon_templ
    {
    // déclarations...
    };
    #include "mon_templ.tpp"
    mon_templ.tpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // définitions :
    template<class T>
    mon_templ<T>::....
    mon_templ.tpp n'est pas rajouté dans les fichiers à compiler du makefile en tant que tel.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bon, finalement j'ai craqué et j'ai tout mis dans le .h.

    Attendu que tout le monde conseille de faire ainsi.
    Attendu que je n'arrive pas à maîtriser tous les tenants et aboutissants de la chose (pas plus que mon compilateur n'y parvient d'ailleurs ).

    L'idée d'inclure un fichier .impl dans l'entête est un compromis mais cela ajoute un fichier de plus à gérer. Donc, au diable les habitudes.

    J'ai toutefois laissé les implémentations des classes spécialisées et des fonctions surchargées spécialisées dans le .cpp. Partant du fait que les types étant fixés dans ces derniers, le compilateur n'a pas besoin d'en savoir plus dans le .h. Ce qui semble marcher. Mon code compile et semble à peu près fonctionner.

    Merci à tous.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/06/2010, 11h37
  2. Erreur interne compilateur visual basic
    Par freerider74 dans le forum Visual Studio
    Réponses: 0
    Dernier message: 15/03/2010, 09h26
  3. Réponses: 26
    Dernier message: 28/01/2010, 12h53
  4. [BOOST] erreur interne du compilateur
    Par venomelektro dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 15/04/2006, 18h08
  5. Réponses: 3
    Dernier message: 13/08/2004, 09h35

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