Problème C++ => template

Problème C++ => template - Programmation

Marsh Posté le 12-03-2002 à 11:53:35    

J'ai créé une classe template CList avec ses déclarations dans un fichier .h et ses définitions dans un fichier .cpp.
Lorsque dans une autre classe je veux un membre ayant pour type CList<int> par exemple j'écris dans sa déclaration:
 
class CMaclasse
{
private:
  CList<int> m_membre;
public:
  CMaclasse();
  ~CMaclasse();
};
 
Dans le fichier .cpp correponsdant a cette nouvelle classe, si je fais :
CMaclasse::CMaclasse()
{
  m_membre = new CList<int>;
}
 
J'ai une erreur de link:  
error LNK2001: unresolved external symbol "public: __thiscall CList<int>::CList<int>(void)"
 
En fait, j'ai l'impression que les définitions de CList ne sont pas prises en compte...
 
Si vous comprenez ce je veux dire et que vous pouvez m'aider merci :)


---------------
Une nouvelle vie vous attend sur les mondes colonisés.
Reply

Marsh Posté le 12-03-2002 à 11:53:35   

Reply

Marsh Posté le 12-03-2002 à 11:58:02    

Mets les définitions de ta classe template dans son en-tête. D'après mes souvenirs beaucoup de compilateurs n'aiment pas les définitions de classes templates en dissociant en-tête et définition. Pour résoudre ça il leur faut tout définir au même endroit.  
 
Si quelqu'un a mieux je prends aussi. :hello:

 

[jfdsdjhfuetppo]--Message édité par Krueger--[/jfdsdjhfuetppo]


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 12-03-2002 à 12:06:55    

Pff, bien sûr, c'était pas une classe qu'il avait lui-même définie. Quel idiot à répondre trop rapidement...

Reply

Marsh Posté le 12-03-2002 à 12:17:53    

Pourquoi mettre CList<int,int> ? Je n'ai qu'un type a spécifier.
J'ai quand meme essayer et le compilo dit ; too much arguments.
 
En attendant j'ai regroupé déclarations et définitions car là ca marchait. Y a pas moyen de les séparer?


---------------
Une nouvelle vie vous attend sur les mondes colonisés.
Reply

Marsh Posté le 12-03-2002 à 15:21:36    

Donne la déclaration de ta CList sinon on ne pourra jamais t'aider.
 
Sinon, en MFC, il y a déjà une classe qui s'appelle CList<T,T>, d'où ma confusion.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 12-03-2002 à 16:52:29    

Voila la déclaration:
template <class T>
class CList
{
protected:
  int           m_iSize;
  CListNode<T> *m_pHead;
  CListNode<T> *m_pTail;
 
public:
  CList( void );
  ~CList( void );
  ...
};


---------------
Une nouvelle vie vous attend sur les mondes colonisés.
Reply

Marsh Posté le 12-03-2002 à 17:09:31    

mets la declaration et l'implementation dans le .h
 
si tu separes ca en .h .cpp, le compilo va rien comprendre (cf 1er reply de Krueger)

Reply

Marsh Posté le 12-03-2002 à 19:33:48    

Ok, je fais comme ca. Merci :)
Sur un livre, ils disaient qu'il était possible de séparer mais bon on va pas se prendre la tête :)


---------------
Une nouvelle vie vous attend sur les mondes colonisés.
Reply

Marsh Posté le 12-03-2002 à 19:44:47    

ben moi, je sépare quand même en h et cpp.
je mets les declarations dans le h et le code dans un cpp.
puis si un code a besoin de mon template je fais l'include
du cpp.

Reply

Marsh Posté le 12-03-2002 à 20:04:40    

ayachi a écrit a écrit :

ben moi, je sépare quand même en h et cpp.
je mets les declarations dans le h et le code dans un cpp.
puis si un code a besoin de mon template je fais l'include
du cpp.  




Je fais pareil aussi

Reply

Marsh Posté le 12-03-2002 à 20:04:40   

Reply

Marsh Posté le 12-03-2002 à 20:17:31    

Aaaah voila !!!
C'est la solution qu'il me fallait !!!
Il faut inclure le fichier .cpp quand on en a besoin et pas le fichier .h !
J'ai testé, ca a l'air de marcher séparé maintenant :) Merci !!


---------------
Une nouvelle vie vous attend sur les mondes colonisés.
Reply

Sujets relatifs:

Leave a Replay

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