J'ai hésité entre poster ici et sur le forum propre à Eclipse car je n'arrive pas à comprendre d'où vient mon problème, et s'il s'agit d'un problème lors du build automatique d'Eclipse ...
Voilà le problème :
j'ai une classe template Stack toute basique, avec un constructeur qui exige un paramètre : la taille de la pile, le tout sur deux fichiers : Stack.hpp et Stack.cpp comme suit :
(code réduit au minimum, les deux fichiers sont bien dans un répertoire source nommé "tool")
Stack.hpp
Stack.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 #ifndef _STACK_HPP_ #define _STACK_HPP_ template <typename T> class Stack { private: int iSizeMax; int iSize; public: Stack(int size); ~Stack(); }; #endif // _STACK_HPP_
Jusque là aucun problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include "Stack.hpp" template <typename T> Stack<T>::Stack(int size) : iSizeMax(size), iSize(0) { return; } template <typename T> Stack<T>::~Stack() { return; }
Mais en essayant d'instancier une pile dans un fichier main.cpp j'obtiens une erreur :
main.cpp
Les erreurs sont :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #include "tool/Stack.hpp" int main() { Stack<int> myStack(30); return 0; }
1) ligne contenant : Stack<int> myStack(30);
undefined reference to `Stack<int>::Stack(int)
2) ligne contenant : return 0;
undefined reference to `Stack<int>::~Stack()
Lorsque je remplace directement dans la déclaration (.hpp) de ma classe le constructeur ou le destructeur par :
Stack(int size) { }
~Stack() { }
les erreurs correpondantes disparaissent, ce qui m'a fait penser à un problème de build où Eclipse essairait de compiler main.cpp avant Stack.cpp.
Votre diagnostique ?
je ne sais plus créer/instancier une malheureuse classe template, ou je dois commencer à utiliser mon propre Makefile ?
Autre question au passage : quelle est la différence entre
template <class T>
et
template <typename T> ?
Partager