Если бы вы разрабатывали класс вместо шаблона, то, что вы делаете, было бы неправильно, потому что вы переопределяли типы.
Но поскольку вы пишете шаблоны, вы ошибаетесь раньше: вы не можете отдельно скомпилировать шаблоны.
Краткий указатель на модель компиляции C ++:
// Definition of Node
template<typename T>
struct Node {
T info;
T* next; // shouldn't that be a Node*?
};
// Definition of MyStack
template <typename T>
class MyStack
{
private:
Node<T> *top;
public:
// Declarations, but not definitions, of the Mystack function members.
void Push(T item);
void Pop();
int Top();
void Print();
};
// Example definition of MyStack::Push
template<typename T>
void
MyStack<T>::Push(T item)
{
// as before
}
Определения типов обычно появляются в заголовках (если они должны быть повторно использованы в разных TU) с включенными защитными элементами, как вы делаете. Охранники здесь, потому что определения должны появляться не более одного раза за TU. Не повторяйте вручную определение типа (например, в исходном файле, как вы это сделали). Это неправильно, как и должно быть: никто не хочет ошибок копирования-вставки.
Члены функции определения обычно появляются в исходных файлах, , если они не являются элементами шаблона. В последнем случае их проще помещать в заголовки (они также не должны быть встроенными).
Вы можете узнать подробности модели компиляции в другом месте на SO, или в книгах, или в Интернете. Поиск по «определению шаблона» или «правилу одного определения» (или ODR) может помочь.