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 :

Erreur de lien sur templates


Sujet :

C++

  1. #21
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Citation Envoyé par Herode
    Oups, j'ai du rater des mails signalant les réponses
    cela arrive facilement.
    Citation Envoyé par Luc Hermitte
    Ce ne serait pas un problème de VC6 avec définition de l'opérateur ami à l'extérieur de la classe ?
    C'est bien VC6 et un opérateur ami défini (forcément) hors de la classe. Je déduis de ta question que VC6 est boggué sur ce point ?
    Je me souviens qu'il y en avait qui était buggué sur ce point, sans me souvenir duquel, bien qu'avec une forte présomption de culpabilité pour VC.

    Et au fait, "ami" n'implique pas forcément de le définir en dehors de la déclaration de la classe. C'est même un peu la seule solution portable. Quitte à appeler une fonction membre qui sera définie plus loin.

  2. #22
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Et au fait, "ami" n'implique pas forcément de le définir en dehors de la déclaration de la classe. C'est même un peu la seule solution portable. Quitte à appeler une fonction membre qui sera définie plus loin.
    Je ne connaissais pas cette possibilité. C'est toujours bon à savoir ! 8)

  3. #23
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    J'ai un problème similaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    main.obj : error LNK2005: "public: void __thiscall ArbreCP::insererCode(char,char *)" (?insererCode@ArbreCP@@QAEXDPAD@Z) déjà défini(e) dans codeprefix.obj
    main.obj : error LNK2005: "protected: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall ArbreCP::retournerCode(char,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class NoeudArbre<char> *)" (?retournerCode@ArbreCP@@IAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@DV23@PAV?$NoeudArbre@D@@@Z) déjà défini(e) dans codeprefix.obj
    main.obj : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall ArbreCP::retournerCode(char)" (?retournerCode@ArbreCP@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@D@Z) déjà défini(e) dans codeprefix.obj
    .\Debug/compress.exe : fatal error LNK1169: un ou plusieurs symboles définis à différentes reprises ont été rencontrés
    En fait, j'ai par exemple une classe template Arbre où le .cpp est inclu dans le .h de la classe template Arbre.

    Maintenant, j'ai une autre classe, CodePrefix qui elle a besoin d'un objet de type Arbre, donc j'inclus le fichier .h de la classe template Arbre dans mon fichier .h de la classe CodePrefix.

    Maintenant, j'ai mon programme principal (la fonction main) qui est dans le fichier main.cpp.

    Dans ce fichier, j'inclus le fichier codeprefix.h. C'est alors à ce moment que tout se met à planter ...!

    Et je crois que je viens de résoudre mon problème... En fait, il fallait que j'enlève mon fichier .cpp de la classe codeprefix du projet... ?!?

    Et ça fonctionne !

  4. #24
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Non en fait ça ne fonctionne pas du tout parce qu'à ce moment-là toutes les fonctions avec l'objet que j'utilise dans mon main qui proviennent de la classe CodePrefix n'est pas résolu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main.obj : error LNK2019: symbole externe non résolu "public: int __thiscall CodePrefix::ecritureFichier(void)" (?ecritureFichier@CodePrefix@@QAEHXZ) référencé dans la fonction _main

    Comment me sortir de cet impasse ?!


    ***

    EDIT:

    J'ai finalement résolu mon problème, en fait, je traite ma classe CodePrefix comme si elle aussi était une classe template et alors je n'ai plus de problème ! C'est-à-dire que j'enlève le .cpp de mon projet pour le rajouter dans le .h de la même façon qu'avec mon .h de ma classe Arbre qui elle, est un template !

    Quand même étrange d'avoir à faire ça non ?!

  5. #25
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    On ne peut pas trop t'aider juste en ayant les erreurs...
    Si tu inclus dans ton header un cpp, change son nom en header.
    Si c'est une classe template, c'est normal qu'on la mette en header, c'est toujours comme ça. En revanche, mets les fonctions de la classe en inline dans la classe et non pas dans un fichier à côté.

  6. #26
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Miles
    Si c'est une classe template, c'est normal qu'on la mette en header, c'est toujours comme ça.
    Oui, ma classe Arbre, qui est un template, est définit dans un .h et le .cpp (la définition des fonctions membres de la classe) est inclu à la toute fin du fichier en faisant #include "arbre.cpp", avant le #endif (du #ifndef _ARBRE_H #define _ARBRE_H) comme cela est mentionné dans la FAQ !

    Maintenant, ce que je me demande, c'est si une classe qui possède un objet d'une classe template doit elle aussi être mise en header, de la même façon que la classe template ? Parce que jusqu'à maintenant, c'est le seul moyen "légitime" que j'ai trouvé pour résoudre mon problème...

  7. #27
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Hé bien, une classe qui possède un objet générique est elle-même une classe générique, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template< class T> 
    class G {
       [...]
       T member;
    };

  8. #28
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ben oui...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Erreur 404 pour des liens sur la welcome page
    Par Roy Miro dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 01/05/2011, 19h49
  2. [Joomla!] Erreur à l'installation de template sur site distant
    Par Siguillaume dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 29/09/2008, 17h52

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