Разделение класса в заголовочный файл и в файл с кодом

214
15 декабря 2016, 16:11

Вроде всегда так класс разделял в h-хедерные файлы и cpp-файлы с кодом, но в этот раз что-то пошло не так :( Пишет Unresolved external blablabla.obj

Main Header CPP

Подскажите, пожалуйста, где я в этот раз ошибся?

Answer 1

Проблема в шаблонах. Шаблоны надо размещать полностью в header'е.

Дело в том, что шаблонный класс не есть класс, и не генерирует вовсе никакого кода. Код будет сгенерирован «задним числом» в момент инстанциации шаблона, то есть, в тот момент, когда вы объявляете шаблон с конкретным параметром! (В вашем случае это main.) Если выгрузить имплементацию шаблона в .cpp, она будет в этой точке компиляции недоступна, и приведёт к ошибке компоновки.

Есть, правда, ещё один путь: если вы точно знаете все типы, с которыми будет когда-либо инстанциироваться шаблон, вы можете оставить имплементацию в .cpp, и добавить туда список для явной инстанциации:

template class Stack<char>;

Но это сработает только лишь если вы контролируете все места, где ваш шаблон будет использован. Если вы пишете библиотеку общего пользования, вы не можете знать наперёд, с какими типами её будут использовать клиенты, то есть этот трюк не пройдёт, и вам таки придётся писать всё в header'е. (Так работает вся STL, например.)

Дополнительное чтение по теме: [C++ FAQ/Templates/linker errors].

READ ALSO
Проблема с переопределением std::function [закрыто]

Проблема с переопределением std::function [закрыто]

и снова доброго вечера всем форумчанамВозникла проблема с переопределением объектов std::function<void()> и будто вещь это не особо сложная, а разобраться...

200
Ошибка при выполнении программы

Ошибка при выполнении программы

Учу Си по книге Стивена Прата "СЛекции и Упражнения

255
Как сложить две строки?

Как сложить две строки?

Необработанное исключение в "0x003fd2e9 (msvcr100ddll)" в "test1

349
Перенос текста из одного ListBox в другой

Перенос текста из одного ListBox в другой

Прошу, подскажите, мне нужно перенести весь текст элемента ListBox в другойЭтот код переносит почему-то только часть текста:

256