Bonjour à tous,

je ne sais plus quoi chercher pour utiliser une fonction membre d'une classe template sans que le linker ne râle. Je n'arrive pas à linker (mais bien à compiler) le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef MAILLON_HPP
#define MAILLON_HPP
 
template <class T>
class Maillon {
 
private:
  T data;
  Maillon<T> *suivant;
 
 
public:
  Maillon();
  ~Maillon();
};
 
 
#endif //MAILLON_HPP
(maillon.hpp)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
#include "maillon.hpp"
 
 
template <class T> Maillon<T>::Maillon()
{
  cout << "constructeur de maillon" << endl;
  suivant = NULL;
}
 
template <class T> Maillon<T>::~Maillon()
{
  delete suivant;
  suivant = NULL;
}
(maillon.cpp)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
#include "maillon.hpp"
 
int main()
{
  Maillon<int> m;
  return 0;
}
(client.cpp)

g++ -c maillon.cpp ==> OK
g++ -c client.cpp ==> OK
g++ client.o maillon.o ==> compile mais ne linke pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
client.o(.text+0x17): In function `main':
: undefined reference to `Maillon<int>::Maillon[in-charge]()'
client.o(.text+0x22): In function `main':
: undefined reference to `Maillon<int>::~Maillon [in-charge]()'
collect2: ld returned 1 exit status

Par contre, lorsque je remplace maillon.cpp par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
#include "maillon.hpp"
 
 
Maillon<int>::Maillon()
{
  cout << "constructeur de maillon" << endl;
  suivant = NULL;
}
 
Maillon<int>::~Maillon()
{
  delete suivant;
  suivant = NULL;
}
Eh bien là, ô miracle, ça linke (mais ça n'est plus un vrai beau template)......

je suis preneur si vous avez une idée, merci à vous !

P.S. : que veut dire "in-charge" ?