1

Sous Visual C++ , j'ai une erreur que je ne comprends pas , le programme me renvoi ceci :

guichet.obj : error LNK2001: unresolved external symbol "public: __thiscall List<int>::~List<int>(void)" (??1?$List@H@@QAE@XZ)
guichet.obj : error LNK2001: unresolved external symbol "public: __thiscall List<int>::List<int>(void)" (??0?$List@H@@QAE@XZ)

Mes fonctions sont définies comme cela (.cpp) :

template <class T>
List<T>::List<T>(void)
{ ...... }

et je l'appelle par :

Liste<int> liste;

D'où vient l'erreur confus

merci de me m'aider ...

2

On écrit pas une classe paramétrable lors de l'écriture du constructeur. Ca se fait lors de l'écriture de la classe. Ex :
template<class T> class List {
};

et dedans, tu utilise le type T comme un nouveau type ; en aucun cas, tu réutilises template<class [B]T[/B]>.

3

Si tu écris tes fonctions à l'extérieur de ta classe, ça donne :
template<class T> List<T>::List (...) { }

A noter qu'il existe le type list dans la librairie standard : http://msdn.microsoft.com/library/en-us/vclang98/html/LIST.asp

4

Dans le .h je n'avais déclaré template<class T> qu'au début comme tu l'a marqué ds #1 donc l'erreur ne venait pas de là


J'avais déclarer comme suit (aprés coup c'était plus logique) :

template<class T> Liste<T>::Liste (...) { .... }
dans le .cpp

Mais l'erreur est la même , j'ai même changé le nom en Liste pour pas chambouler avec la STL au cas où.

Bon pour étre précis mon code ça donne ça
// liste.h template<class T>  class Liste { public:     Liste();     ~Liste(); } // liste.cpp template<class T>  Liste<T>::Liste() { ... } template<class T>  Liste<T>::~Liste() { ... } //main.c int main() { Liste<int> L; }

et l'erreur est toujours la même

5

//main.c

int main()
{
Liste<int> L; }

Voilà probablement le problème, tu ne peux pas importer des templates C++ dans un fichier C. Il faut utiliser un main.cpp!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

6

En fait non, là, j'ai utilisé un fichier C++ et j'ai rajouté le ; manquant après la définition de ta classe (ligne 7), et g++ me donne:
$ g++ -Os -s yodalist.cpp yodatest.cpp -o yodatest.exe
C:TEMP/cchwl6xa.o(.text+0x11):yodatest.cpp: undefined reference to `Liste<int>::Liste()'
C:TEMP/cchwl6xa.o(.text+0x19):yodatest.cpp: undefined reference to `Liste<int>::~Liste()'

JM: sais-tu où se trouve le problème? Parce que moi et les templates... sad
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

7

Kevin > Ben mince , je croyais que tu avais trouvé l'erreur , Hé non : c'est une faute de ma part , c'est bien un main.cpp que j'ai et non main.c

8

Ben, je pensais aussi avoir trouvé l'erreur, mais quand j'ai essayé, j'ai vu que l'erreur est toujours là. sad
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

9

Tiens voilà: le problème est que tu ne peux apparemment pas définir des fonctions template dans un fichier source compilé séparément (parce que ni MSVC++, ni g++ n'implémentent le mot-clé export). Met tes fonctions dans ton header et ça marche.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

10

unknown@K ~
$ cat yodatest.cpp
//main.c

#include "yodalist.h"

int main()
{
Liste<int> L;
}

unknown@K ~
$ cat yodalist.h
// liste.h
template<class T> 
class Liste
{
public:
    Liste();
    ~Liste();
};

template<class T>
Liste<T>::Liste()
{ /*...*/ }

template<class T>
Liste<T>::~Liste()
{ /*...*/ }

unknown@K ~
$ g++ -Os -s yodatest.cpp -o yodatest.exe

unknown@K ~
$ ls -l yodatest.exe
-rwxr-xr-x    1 unknown  unknown     50176 Nov 11 02:18 yodatest.exe
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

11

Ca marche apparement , Kevin je t'adore love

12

Ben oui ! Je ne sais pas ce que le mot-clé export apporterait mais il faut bien que le compilo sache un minimum de chose sur la classe utilisée pour pouvoir compiler et optimiser ! En C, on met les prototypes et les structures et en C++, c'est toujours pareil.

Ce qu'il faut faire à mon avis si tu utilises une classe MyClass :
1) Créer un fichier MyClass.h dans lequel tu mets :
class MyClass {
// des données :
	int x;
	void *p;
// des membres :
	int f1 ();
public:
	void f2 (char);
}

2) créer un ffichier MyClass.cpp  avec le code :
#include "MyClass.h"

int MyClass::f1 () {
// ...
}

void MyClass::f2 (char c) {
// ...
}


3) Pour utiliser classe, il suffut d'inclure MyClass.h

13

Oui , merci JM, je sais construire une classe tongue , le probleme venait des Templates que je n'ai pu résoudre qu'en regroupant au sein d'un même fichier les déclarations et les méthodes .... reste que je sais toujours pas pourquoi la structure .h et .cpp ne marche pas avec des Templates confus

14

À cause de ça et de ça.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

15

Je commence a aprendre les template en C++ et mon a ma dit: On met les fonctions DANS LE POINT H, avec la définition de la classe.

// MaCLasse.h

template <class T>
class MaClasse
{
....
};

template <class T>
MaClasse<T>::Fonction1(...)
{
....
}

// MonMain.cpp

#include "MaClasse.h"
...
MaCLasse<type> ClasseA;
...

16

sous MSVC

on met la def de la clase dans le .h
dans le .h, on inclut le .cpp qui contieznt les fonctions
et on ne met pas le .cpp dans le projet, sinon il foire à la compilation (ou link, je sias plus)
ça marche... il y a peut-être autre technique (celle-ci correspond en gros à tout mettre dans le .h)
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

17

Jarode a écrit :
Je commence a aprendre les template en C++ et mon a ma dit: On met les fonctions DANS LE POINT H, avec la définition de la classe.

// MaCLasse.h

template <class T>
class MaClasse
{
....
};

template <class T>
MaClasse<T>::Fonction1(...)
{
....
}

// MonMain.cpp

#include "MaClasse.h"
...
MaCLasse<type> ClasseA; ...

C'est ce que j'ai dit au #8 et #9.
squale92 a écrit :
sous MSVC

on met la def de la clase dans le .h
dans le .h, on inclut le .cpp qui contieznt les fonctions
et on ne met pas le .cpp dans le projet, sinon il foire à la compilation (ou link, je sias plus) ça marche... il y a peut-être autre technique (celle-ci correspond en gros à tout mettre dans le .h)

Ça revient exactement au même. Tu utilises un .cpp comme un header (ce qui est discutable - oui, il y a des fonctions dedans, mais techniquement ça reste un header!), mais sinon c'est pareil.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

18

Kevin> clair que ça me parait pas joli comme méthode...
mais c'est comme ça qu'on m'a appris à faire
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

19

À ta place, j'appellerais ce fichier un fichier .h. Ce n'est pas idéal non plus parce qu'il y a des fonctions dedans, mais c'est techniquement plus correct. Quant à la solution idéale, si j'ai bien compris, ça serait le mot-clé export. Mais hélas, ni MSVC++, ni g++ ne comprennent ce mot-clé pour l'instant. (Il est difficilement implémentable.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

20

avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

21

À ta place, j'appellerais ce fichier un fichier .h.

si je suis ammené à utiliser des templates un de ces jours, je teste smile
(il me semble pas que j'en utilise encore dans le projet... mais ça peut revenir)
(et j'ai plus de cours de C++... et j'ai rarement besoin de templates (en général, je me fait des petits utilitaires, pour lesquels je me moque un peu de la généricité smile)


avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall