Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1829 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Symbole externe non résolu sous Visual

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Symbole externe non résolu sous Visual

n°1901676
NathanGe
Posté le 02-07-2009 à 16:38:19  profilanswer
 

Bonjour,
 
Je rencontre un problème à la compilation d'un projet en C++ écrit sous Microsoft visual Studio que je ne comprends pas.
De manière simplifiée, j'ai rédigé trois fichiers :
 
Article.h
 

Code :
  1. #ifndef _NR_H_
  2. #define _NR_H_
  3. namespace Article
  4. {
  5.  template<typename T>
  6.  T cube(T);
  7. }
  8. #endif _NR_H_


 
Article.cpp
 

Code :
  1. #include "Article.h"
  2. template<typename T>
  3. T Article::cube(T a)
  4. {
  5. return (a*a*a);
  6. };


 
et main.cpp
 
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. #include "Article.h"
  4. int main()
  5. {
  6. int tata = 5;
  7. cout << Article::cube(tata) << endl;
  8. system("pause" );
  9. }


 
 
La compilation se passe bien jusquà l'édition de lien qui renvoie le message :
 

Code :
  1. 1>main.obj : error LNK2019: symbole externe non résolu "int __cdecl Article::cube<int>(int)" (??$cube@H@Article@@YAHH@Z) référencé dans la fonction _main
  2. 1>C:\Users\NathanGe\Documents\Visual Studio 2005\Projects\Template\Test\Debug\Test.exe : fatal error LNK1120: 1 externes non résolus
  3. 1>Le journal de génération a été enregistré à l'emplacement "file://c:\Users\NathanGe\Documents\Visual Studio 2005\Projects\Template\Test\Test\Debug\BuildLog.htm"
  4. 1>Test - 2 erreur(s), 0 avertissement(s)
  5. ========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========


 
Sauriez-vous d'ou provient cette erreur ?
 
L'utilisation des templates me parait pourtant correcte, d'autant plus que le programme :
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. namespace Article
  4. {
  5.  template<typename T>
  6.  T cube(T);
  7. }
  8. template<typename T>
  9. T Article::cube(T a)
  10. {
  11. return (a*a*a);
  12. };
  13. int main()
  14. {
  15. int tata = 5;
  16. cout << Article::cube(tata) << endl;
  17. system("pause" );
  18. }


 
se compile et s'éxécute sans erreur !
 
Pourriez-vous me fournir une aide pour comprendre mon problème ?
 
Merci d'avance

mood
Publicité
Posté le 02-07-2009 à 16:38:19  profilanswer
 

n°1901677
Joel F
Real men use unique_ptr
Posté le 02-07-2009 à 16:43:42  profilanswer
 

le corps d'un template va dans un .hpp non dans un .cpp

n°1901680
NathanGe
Posté le 02-07-2009 à 16:47:45  profilanswer
 

Je ne retrouve pas ce format dans les fichiers de Visual.
Suffit-il de simplement renommer les fichiers ?
 
Est-ce que ce simple problème d'extension peut expliquer mon problème de compilation ?

n°1901682
NathanGe
Posté le 02-07-2009 à 16:48:37  profilanswer
 

Je viens de test le renommages des fichiers, sans succès.

n°1901684
Joel F
Real men use unique_ptr
Posté le 02-07-2009 à 16:51:04  profilanswer
 

non ...

 

le code de ton tempalte doit etre dans son ficheir d'entete :

 
Code :
  1. #ifndef _NR_H_
  2. #define _NR_H_
  3. namespace Article
  4. {
  5.     template<typename T> T cube(T) { return a*a*a; };
  6. }
  7. #endif
 

et ton Article.cpp n'a pas a existé


Message édité par Joel F le 02-07-2009 à 16:51:34
n°1901688
Un Program​meur
Posté le 02-07-2009 à 16:55:12  profilanswer
 

Ce que Joel veut dire c'est que la definition du template doit generalement (*) etre visible au point d'instantiation.  Une technique est de la mettre dans l'entete (que Joel a appele .hpp mais toi tu lui a donne .h comme extension, l'extension ne joue aucun role) directement.  Certains utilisent un .tpp inclu dans le .hpp (ou le .h) permettant de separer clairement l'implementation de l'interface.
 
(*) Faire une recherche sur "export template" pour les amateurs d'exceptions.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1901691
NathanGe
Posté le 02-07-2009 à 16:59:24  profilanswer
 

OK, cela marche effectivement ;)
 
Par contre, je ne comprends pas pourquoi la précédente écriture n'est pas autorisée.
 
Notamment, si la méthode est bcp plus longue que celle de ce test (ce qui est mon cas), est-ce que je reste contraint de la définir dans le même fichier que Article.h ?

n°1901694
Un Program​meur
Posté le 02-07-2009 à 17:06:53  profilanswer
 

Le probleme principal est qu'instancier un template genere du code.  Fait la recherche que j'ai conseille.  Allez, un lien parmi d'autres possible: http://www.bourguet.org/v2/cpplang/export.pdf
 


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1901712
NathanGe
Posté le 02-07-2009 à 18:06:33  profilanswer
 

Ok, merci de ces précisions,
 
l'écriture de Article.h en :
 

Code :
  1. #ifndef _ART_
  2. #define _ART_
  3. namespace Article
  4. {
  5.  template<typename T>
  6.  T cube(T);
  7. };
  8. template<typename T>
  9. T Article::cube(T a)
  10. {
  11. return (a*a*a);
  12. };
  13. #endif _ART_


 
marche parfaitement, ce que je recherchais.
 
Encore merci de votre aide,
 
NathanGe


Message édité par NathanGe le 02-07-2009 à 18:07:34

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Symbole externe non résolu sous Visual

 

Sujets relatifs
[Résolu]Pb trigger MysqlSuite de test avec JUnit[résolu]
[Visual C++] Problème conversion System::String ^ et structure[Resolu][Asp.NET][C#] Composants COM et serveur IIS
visual 2005 et fichier redistCréation nouvelle application Sous Visual Studio
[RESOLU] Qualité de l'impression[Résolu] Arrondir avec la fonction Format
[RESOLU] Problème étrange avec le Main[Visual Studio] symbole externe non résolu
Plus de sujets relatifs à : Symbole externe non résolu sous Visual


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR