Ci sono un paio d'errori! Questo è il main funzionante:
codice:
#include <iostream>
#include "stack.cpp"
#include <string>
using namespace std;
int main() {
string str;
char *uno;
uno = (char*) malloc(sizeof(char));
cout << "La parola che verrà inserita e: Rosa.\n";
Stack<char> p(7);
p.push('a');
p.push('s');
p.push('o');
p.push('R');
*uno = p.pop();
str.append(uno);
*uno = p.pop();
str.append(uno);
*uno = p.pop();
str.append(uno);
*uno = p.pop();
str.append(uno);
cout << "La parola inserita è:" << str << ".\n";
}
Il metodo append non vuole un carattere come argomento, ma un puntatore a carattere (ossia una stringa C), quindi devi creare un puntatore a carattere e assegnare alla locazione da esso puntata il nuovo carattere che, di volta in volta, verrà estratto dalla pila.
Poi c'è un piccolissimo errore nel file Stack.cpp: nel metodo isEmpty() avevi effettuato il confronto utilizzando l'operatore =, al posto dell'operatore == (distrazione, probabilmente). Poi ho modificato il corpo dei metodi isEmpty() e isFull(), così sono stilisticamente migliori: non ha senso ritornare TRUE se un confronto è TRUE e FALSE quando invece risulta FALSE... tanto vale ritornare, direttamente, il valore del confronto! 
codice:
template<class T> bool Stack<T>::isFull() { // (metodo per capire se lo stack è pieno)
return (top == stack_size);
}
template<class T> bool Stack<T>::isEmpty() { // (metodo per capire se lo stack è pieno)
return (top == 0);
}
Ciao.