2017-02-13 17 views
0

Я работаю над проектом с открытым исходным кодом: https://github.com/daniftodi/metalC++ ссылки неопределенной ссылки

У меня есть класс ArrayHolder определен в держатели/ArrayHolder.h и внедрен в держателях/ArrayHolder.cpp

Моего код компилируется; но в моем main.cpp; Мне необходимо:

#include "holders/ArrayHolder.cpp" 

Если я этого не сделаю; Я получаю эту ошибку:

main.cpp.o:(.rodata._ZTV11ArrayHolderI8FunctionE[_ZTV11ArrayHolderI8FunctionE]+0x10): undefined reference to `ArrayHolder<Function>::put(Function*) 

Я не понимаю проблему и не могу найти решение. Пожалуйста, помогите мне.

+1

Включите файл заголовка в main.cpp и при связывании, скажите компилятор связать файл CPP – matesc

+1

Можете ли вы пойти немного более подробно, что ваша проблема? Может быть, какой-то код CMake? Потому что «Если я не включаю ArrayHolder.cpp ... я получаю ошибку компоновщика», кажется довольно очевидным. Просто угадайте: вы строите библиотеку и забыли связать ее с 'main' с командой [' target_link_libraries() '] (https://cmake.org/cmake/help/latest/command/target_link_libraries.html)? – Florian

+0

Вот мой файл CMakeList: https://github.com/daniftodi/metal/blob/master/CMakeLists.txt – daniftodi

ответ

1

Если вы работаете с шаблонами; вам необходимо определить их в заголовке ; вы не можете определить их в источниках файлов, подобных обычным методам или функциям.

Смотрите этот вопрос для дальнейшего использования: Why can templates only be implemented in the header file?

+0

Спасибо. Я также нашел полезное объяснение здесь: https://www.codeproject.com/Articles/48575/How-to-define-a-template-class-in-a-h-file-and-imp – daniftodi