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 :
(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
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.cpp)
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; }
(client.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; }
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 :
Eh bien là, ô miracle, ça linke (mais ça n'est plus un vrai beau template)......
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; }
je suis preneur si vous avez une idée, merci à vous !
P.S. : que veut dire "in-charge" ?
Partager