Краткий ответ: вы не хотите включать определения ваших Vector
функций-членов в Vector.cpp
и должны переместить их в Vector.h
.Длинный ответ заключается в том, что шаблон не является классом: это шаблон , с помощью которого создается класс.Таким образом, определения шаблона должны быть доступны в модуле компиляции (исходный файл), который включает в себя Vector.h
.
. Общее решение, если вы хотите отделить вещи, - это, скажем, VectorImpl.h
:
// VectorImpl.h
template<class T>
Vector<T>::Vector(T x, T y, T z) { ... }
И включите его из Vector.h
, например, так:
// Vector.h
#ifndef VECTOR_H
#define VECTOR_H
template<class T>
class Vector { ... };
#include "VectorImpl.h"
#endif
Там есть обстоятельства, при которых вы хотели бы хотеть иметьa Vector.cpp
: в частности, если вы хотите ограничить Vector
только несколькими типами, вы можете создать экземпляр Vector
с этими типами явно в Vector.cpp
:
template class Vector<double>;
Это позволяет вамсоздавать, например, библиотеки предварительно скомпилированных шаблонов.Однако для ваших целей вы можете просто придерживаться обычного решения только для заголовков.