@youkerni
Unity3D developer

Создал класс в чистом проекте С++, но при попытке выделить память под него в main ловлю неразрешенный внешний символ. Почему?

файл заголовка
#pragma once
template <typename T>
class Tree
{
public:
	Tree();
	~Tree();
};

cpp файл
#include "pch.h"
#include "Tree.h"


template <typename T>
Tree<T>::Tree()
{
}


template <typename T>
Tree<T>::~Tree()
{
}

main
int main()
{
	auto tvar = new Tree<int>;
    std::cout << "Hello World!\n"; 
}


Если переношу реализацию конструктора и деструктора в заголовок - все работает.
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
cpp файл
template <typename T>
Tree<T>::Tree()
{
}

Как по-твоему компилятор во время компиляции этого cpp файла узнает, что ты захочешь работать с Tree<int> в каком-то другом файле?
Только если ты в этой же единице трансляции сделаешь явное инстанцирование нужных тебе типов. Иначе объектный файл, получившийся в результате копиляции этого cpp файла будет (почти) пустым.

Если переношу реализацию конструктора и деструктора в заголовок - все работает.

...и это -- типовое решение этой проблемы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы