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

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

Marsh Posté le 25-01-2006 à 22:27:30    

: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
Reply

Marsh Posté le 25-01-2006 à 22:27:30   

Reply

Marsh Posté le 25-01-2006 à 23:25:55    

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)

Reply

Marsh Posté le 26-01-2006 à 00:25:51    

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...

Reply

Marsh Posté le 26-01-2006 à 00:34:34    

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

Reply

Marsh Posté le 26-01-2006 à 08:46:11    

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

Reply

Marsh Posté le 26-01-2006 à 08:53:48    

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
 

Reply

Marsh Posté le 26-01-2006 à 09:09:53    

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. }

Reply

Marsh Posté le 26-01-2006 à 09:16:42    

ca n'a rien a voir avec windows

Reply

Marsh Posté le 26-01-2006 à 09:22:16    

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

Reply

Marsh Posté le 26-01-2006 à 09:32:33    

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

Reply

Marsh Posté le 26-01-2006 à 09:32:33   

Reply

Marsh Posté le 26-01-2006 à 10:46:34    

t'as std::max sinon hein

Reply

Marsh Posté le 26-01-2006 à 19:38:48    

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.

Reply

Marsh Posté le 27-01-2006 à 10:02:14    

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

Reply

Marsh Posté le 30-01-2006 à 21:40:07    

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 !)
 

Reply

Marsh Posté le 31-01-2006 à 09:10:25    

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

Reply

Marsh Posté le 31-01-2006 à 11:50:08    

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
Reply

Marsh Posté le 31-01-2006 à 17:54:41    

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!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed