Страницы

Поиск по вопросам

вторник, 25 февраля 2020 г.

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

#cpp #header #build


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


Ответы

Ответ 1



Проблема в шаблонах. Шаблоны надо размещать полностью в header'е. Дело в том, что шаблонный класс не есть класс, и не генерирует вовсе никакого кода. Код будет сгенерирован «задним числом» в момент инстанциации шаблона, то есть, в тот момент, когда вы объявляете шаблон с конкретным параметром! (В вашем случае это main.) Если выгрузить имплементацию шаблона в .cpp, она будет в этой точке компиляции недоступна, и приведёт к ошибке компоновки. Есть, правда, ещё один путь: если вы точно знаете все типы, с которыми будет когда-либо инстанциироваться шаблон, вы можете оставить имплементацию в .cpp, и добавить туда список для явной инстанциации: template class Stack; Но это сработает только лишь если вы контролируете все места, где ваш шаблон будет использован. Если вы пишете библиотеку общего пользования, вы не можете знать наперёд, с какими типами её будут использовать клиенты, то есть этот трюк не пройдёт, и вам таки придётся писать всё в header'е. (Так работает вся STL, например.) Дополнительное чтение по теме: [C++ FAQ/Templates/linker errors].

Комментариев нет:

Отправить комментарий