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
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_
Stack.cpp
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;
}
Jusque là aucun problème.
Mais en essayant d'instancier une pile dans un fichier main.cpp j'obtiens une erreur :

main.cpp
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;
}
Les erreurs sont :
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> ?