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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Template... erreur tte bete surement...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Template... erreur tte bete surement...

n°1292295
le_duc
PlaTyPuS
Posté le 25-01-2006 à 22:27:30  profilanswer
 

:hello:  
 
je cherche mon erreur là-dedans, mais je trouve pas.... pourtant il doit juste manquer un "Personne::" qq part d'après le compilo non?
 
.h (dans les méthodes publiques de ma classe Personne)

Code :
  1. template <class T>
  2. T Max(const T value1, const T value2);


 
.cpp

Code :
  1. template <class T>
  2. T Personne::Max(const T value1, const T value2)
  3. {
  4.         return ((value1>value2) ? value1 : value2);
  5. }


 
et l'appel du tout depuis le main:

Code :
  1. Personne* p1 = new Personne();       
  2. int i = 0;
  3. int j = 2;
  4. cout << p1->Max(i, j);


 
ERREUR : Unresolved external 'int Personne::Max<int>(const int, const int)' referenced from c:\TEMP\PROGRAMME.OBJ
 
merci pour votre aide ;)

Message cité 1 fois
Message édité par le_duc le 25-01-2006 à 22:29:29
mood
Publicité
Posté le 25-01-2006 à 22:27:30  profilanswer
 

n°1292337
skelter
Posté le 25-01-2006 à 23:25:55  profilanswer
 

le compilateur a besoin du code pour instancier ton template, une solution est de mettre le code dans le fichier d'en-tete ou d'inclure à la place le .cpp (avec accessoirement une autre extension)

n°1292363
le_duc
PlaTyPuS
Posté le 26-01-2006 à 00:25:51  profilanswer
 

bah dans le main et dans le .cpp j'ai inclus ca:
 

Code :
  1. #include "Personne.h";


 
... sinon je comprends pas ce que tu me dis...

n°1292366
skelter
Posté le 26-01-2006 à 00:34:34  profilanswer
 

pour faire simple, mets le contenu du .cpp dans Personne.h

n°1292394
le_duc
PlaTyPuS
Posté le 26-01-2006 à 08:46:11  profilanswer
 

et y'a pas moyen de faire autrement???
 
c franchement pas terrible :-SSSSS

n°1292399
chrisbk
-
Posté le 26-01-2006 à 08:53:48  profilanswer
 

bah apres y'a eds bricoles, mais dans l'idée, non
 
 

Citation :

T Personne::Max(const T value1, const T value2)


 
Tu fais de la recopie plein pot, la, et tes const en param servent a pas grand chose...Passe par reference plutot
 

n°1292404
LordPeterP​an
Posté le 26-01-2006 à 09:09:53  profilanswer
 

Sous windows les templates sont chiants à programmer car tu ne peux dissocier l'entête et le source de la fonction.
Exemple d'un fichier avec déclaration de template :
 

Code :
  1. // Les déclarations
  2. tempate<class T>
  3. T max(T& t1, T& t2);
  4. // ...
  5. // tes autres déclarations
  6. // ...
  7. // Les corps des fonctions
  8. tempate<class T>
  9. T max(T& t1, T& t2)
  10. {
  11.     if (t1>t2)
  12.        return t1 ;
  13.     else
  14.        return t2 ;
  15. }

n°1292406
chrisbk
-
Posté le 26-01-2006 à 09:16:42  profilanswer
 

ca n'a rien a voir avec windows

n°1292408
skelter
Posté le 26-01-2006 à 09:22:16  profilanswer
 

mais ce n'est pas lié à windows ??
je crois qu'avec l'instenciation explicite on doit pouvoir compiler séparément le fichier qui contient les définitions mais le nombre d'instenciation devient limité  
http://www.linux-kheops.com/doc/co [...] /x4522.htm

n°1292420
Joel F
Real men use unique_ptr
Posté le 26-01-2006 à 09:32:33  profilanswer
 

LordPeterPan a écrit :

Sous windows les templates sont chiants à programmer car tu ne peux dissocier l'entête et le source de la fonction.


 
Aucun rapport avec windows :o
Un seul compilo gére la declaration séparé des templates. Mais pas mal de gens (Sutter par exemple) en viennent à penser que c'est inutile, voire dangeruex.
 
http://std.dkuug.dk/jtc1/sc22/wg21 [...] /n1426.pdf

mood
Publicité
Posté le 26-01-2006 à 09:32:33  profilanswer
 

n°1292463
Taz
bisounours-codeur
Posté le 26-01-2006 à 10:46:34  profilanswer
 

t'as std::max sinon hein

n°1292989
++fab
victime du syndrome IH
Posté le 26-01-2006 à 19:38:48  profilanswer
 

Joel F a écrit :

Aucun rapport avec windows :o
Un seul compilo gére la declaration séparé des templates. Mais pas mal de gens (Sutter par exemple) en viennent à penser que c'est inutile, voire dangeruex.
 
http://std.dkuug.dk/jtc1/sc22/wg21 [...] /n1426.pdf


 
Sutter est l'un des seuls experts à penser cela. Son papier est assez controversé. Il justifie en s'appuyant sur la parole d'autres experts (ceux d'EDG je crois), qui ne sont en fait pas de son avis.

n°1293177
Taz
bisounours-codeur
Posté le 27-01-2006 à 10:02:14  profilanswer
 

moi je suis d'accord avec joelf, l'export est très controversé et par beaucoup, sur beaucoup d'aspect d'ailleurs.

n°1295162
++fab
victime du syndrome IH
Posté le 30-01-2006 à 21:40:07  profilanswer
 

Taz a écrit :

moi je suis d'accord avec joelf, l'export est très controversé et par beaucoup,


par les lecteurs de Herb ?
 

Taz a écrit :

sur beaucoup d'aspect d'ailleurs.


Herb en fait une critique exhaustive. Il n'insiste pas sur un point, qui est le gain en temps de compilation "dans certains cas".
Les gens qui militent pour export, et qui l'ont expérimenté sur d'autres compilos, sont, je crois, convaincu de son intérêt.
Le papier anti-export visait à supprimer export. Au WG21, il y a eu un accord de principe qui disait, on maintient export tant qu'il n'y a pas de meilleure proposition (qui nécessiterait d'évincer export).
Le fait est qu'une proposition -- qui touche aussi d'autres aspects du langage -- pourrait faire son chemin, et généraliser export aux fonctions non-template et aux classes non-template. Ce n'est pas sur que ça évolue dans ce sens, mais c'est une possiblité ( et ça serait superbe !)
 

n°1295293
chrisbk
-
Posté le 31-01-2006 à 09:10:25  profilanswer
 

(ouais mais a quoi bon avoir un mot clé qui n'est supporté par presque aucun compilo ?)

n°1295403
breizhbugs
Posté le 31-01-2006 à 11:50:08  profilanswer
 

le_duc a écrit :

:hello:  
...
et l'appel du tout depuis le main:

Code :
  1. Personne* p1 = new Personne();       
  2. int i = 0;
  3. int j = 2;
  4. cout << p1->Max(i, j);




1- tu ne precise pas quand tu construit 'p1' que ta classe va utiliser des <int>:
Personne<int> *p1 = new Personne<int>();        // je ne suis pas sur de l'ecriture exacte
 
2-

Code :
  1. template <class T>T Personne::Max(const T value1, const T value2){        return ((value1>value2) ? value1 : value2);}


Fais attention: value1>value2 implique que l'operation > est definie pour la classe T, c'est le cas pour les types de base (int, double, char, ...) mais pas pour des classes autres (sauf si l'operateur est redefini/surcharger!).

Message cité 1 fois
Message édité par breizhbugs le 31-01-2006 à 11:53:46
n°1295740
le_duc
PlaTyPuS
Posté le 31-01-2006 à 17:54:41  profilanswer
 

breizhbugs a écrit :

1- tu ne precise pas quand tu construit 'p1' que ta classe va utiliser des <int>:
Personne<int> *p1 = new Personne<int>();        // je ne suis pas sur de l'ecriture exacte
 
2-

Code :
  1. template <class T>T Personne::Max(const T value1, const T value2){        return ((value1>value2) ? value1 : value2);}


Fais attention: value1>value2 implique que l'operation > est definie pour la classe T, c'est le cas pour les types de base (int, double, char, ...) mais pas pour des classes autres (sauf si l'operateur est redefini/surcharger!).


 
:jap:
 
merci beaucoup!


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

  [C++] Template... erreur tte bete surement...

 

Sujets relatifs
VBA On error (Peut-on afficher l'erreur)[JAVA] Erreur BufferedReader, le flux n'est plus pret .....
erreur de segmentationquestion bête sur le C
Question bete sur un programme javaerreur de spécialisation d'un template ...
Gestion d'erreur file_get_contents()Besoin d'aide, erreur php.
erreur dans script d'activation de liens 
Plus de sujets relatifs à : [C++] Template... erreur tte bete surement...


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