Ваша функция друга не является шаблоном, поэтому для определения извне вы должны определить функцию не шаблона для каждого типа (что кажется неосуществимым):
void swap(Stack<int>& lhs, Stack<int>& rhs){/*..*/}
void swap(Stack<char>& lhs, Stack<char>& rhs){/*..*/}
void swap(Stack<MyType>& lhs, Stack<MyType>& rhs){/*..*/}
Проще (и лучше ИМО) определите внутри класса.
template <class T>
class Stack {
// ...
friend void swap(Stack& lhs, Stack& rhs) { /*..*/ };
};
Альтернатива - сделать шаблон функции друга:
template <class T> class Stack;
template <class T> void swap(Stack<T>&, Stack<T>&);
template <class T>
class Stack {
// ...
friend void swap<>(Stack& f, Stack& s); // Only the specialization is friend
};
template <class T>
void swap(Stack<T>& lhs, Stack<T>& rhs){ /**/ }