Когда вы определяете свой шаблон в файле .cpp, вы должны явно создать его экземпляр со всеми известными типами / параметрами шаблона, так как шаблон будет использоваться заранее, вот так (поместите его в файл .cpp):
template class TreeNode<Player>;
Если вы не знаете, с какими параметрами шаблона будет использоваться шаблон, вы должны поместить все определения в заголовок. как
template<typename T>
class TreeNode {
public:
TreeNode() /* now, also put the code into here: */ { doSomething(); }
};
Причина в том, что когда вы собираетесь использовать шаблон откуда-то, компилятор должен иметь возможность генерировать код для этого конкретного экземпляра шаблона. Но если вы поместите код в файл .cpp и скомпилируете его, у компилятора не будет возможности получить код для генерации экземпляров (кроме случаев использования печально известного ключевого слова export
, которое поддерживается только очень несколько компиляторов).
Это также запись в моем ответе на C ++ Pitfalls: Каких ошибок C ++ мне следует избегать?