Salve a tutti, come da titolo, ho per la prima volta cercato di fare una misera compilazione di qualche riga di codice in C++, sono giusto tre files per implementare l'utilizzo di uno stack, giusto per capire come funziona il lingiuaggio.
La compilazione fatta "a mano" cioè

codice:
g++ -c nomefile.cpp
va a buon fine, ma quando successivamente tento di creare l'eseguibile,

codice:
g++ -o nomefile.exe nomefile.o
, ricevo degli errori che, per via dell'inesperienza non riesco a comprendere.

Di seguito allego i files:


codice:
Nome Fie: stack.h


#ifndef _STACK_H


#define _STACK_H 1








template<class T> class Stack {


	T* v;


	static const int max_size = 100;


	int stack_size;


	int top;


public:


	class StackOverflow { };


	class StackUnderflow { };


	class StackBadSize { };





	Stack(int size);


	~Stack();	





	void push(T element);


	T pop();


	bool isFull();


	bool isEmpty();


	int slotsFree();


};





#endif



codice:
Nome Fie: stack.cpp


#include "stack.h"





template<class T> Stack<T>::Stack(int size) {	// (costruttore)


	


	if(size > 0 && size < max_size) {	// se il valore della size è corretto


		stack_size = size;


		v = new T[stack_size];		// alloca spazio nella memoria dinamica (heap)


		top = 0;			// inizializza la testa dello stack a 0	


	


	} else {				// altrimenti


		throw StackBadSize();		// lancia l'eccezione


	}





}








template<class T> Stack<T>::~Stack() {		// (distruttore)





	delete[] v;				// dealloca lo spazio di memoria utilizzato





}








template<class T> void Stack<T>::push(T el) {	// (metodo di inserimento)


	


	if(top == stack_size) {			// se la testa è oltre la dimensione dello stack


		throw StackOverflow();		// lancia l'eccezione di overflow





	} else {				// altriemnti 


		v[top] = el;			// inserisco l'elemento nello stack


		top++;				// incremento top





		


	}





}








template<class T> T Stack<T>::pop() {		// (metodo di estrazione)





	if(top == 0) {				// se la testa è già minore di 0


		throw StackUnderflow();		// lancia l'eccezione





	} else {				// altrimenti


		top--;				// decremento la testa dello stack


		return v[top];			// restituisco l'ultimo valore inserito 


		


	}





}








template<class T> bool Stack<T>::isFull() {	// (metodo per capire se lo stack è pieno)





	if(top == stack_size) {			// se la testa ha lo stesso valore della massima size dello stack


		return true;			// lo stack è pieno





	} else {				// altrimenti


		return false;			// non è pieno


	}





}








template<class T> bool Stack<T>::isEmpty() {	// (metodo per capire se lo stack è pieno)





	if(top = 0) {				// se la testa ha valore 0


		return true;			// lo stack è vuoto





	} else {				// altrimenti


		return false;			// non è vuoto


	}





}







codice:
Nome Fie: prova_stack.cpp


#include <iostream>


#include "stack.h"


#include <string>





using namespace std;





int main() {





cout << "La parola che verrà inserita e: Rosa.\n";








Stack<char> pila(7);


string str;





pila.push('a');


pila.push('s');


pila.push('o');


pila.push('R');





str = pila.pop() + pila.pop() + pila.pop() + pila.pop();





cout << "La parola inserita è:" << str << ".\n";





}


Questo è l'errore che ricevo:


codice:
D:\MinGW\bin>g++ -o prova_stack.exe prova_stack.o


prova_stack.o(.text+0xc3):prova_stack.cpp: undefined reference to `Stack<char>::Stack(int)'


prova_stack.o(.text+0xf1):prova_stack.cpp: undefined reference to `Stack<char>::push(char)'


prova_stack.o(.text+0x102):prova_stack.cpp: undefined reference to `Stack<char>::push(char)'


prova_stack.o(.text+0x113):prova_stack.cpp: undefined reference to `Stack<char>::push(char)'


prova_stack.o(.text+0x124):prova_stack.cpp: undefined reference to `Stack<char>::push(char)'


prova_stack.o(.text+0x136):prova_stack.cpp: undefined reference to `Stack<char>::pop()'


prova_stack.o(.text+0x14b):prova_stack.cpp: undefined reference to `Stack<char>::pop()'


prova_stack.o(.text+0x168):prova_stack.cpp: undefined reference to `Stack<char>::pop()'


prova_stack.o(.text+0x185):prova_stack.cpp: undefined reference to `Stack<char>::pop()'


prova_stack.o(.text+0x321):prova_stack.cpp: undefined reference to `Stack<char>::~Stack()'


prova_stack.o(.text+0x358):prova_stack.cpp: undefined reference to `Stack<char>::~Stack()'


Confido in voi per riuscire a capire dove è che sbaglio... anche se più o meno ho capito, non riesco a risolverlo, forse è dovuto al fatto che vengo da una formazione "java"