LINUX.ORG.RU

Странная ошибка


0

1

http://pastebin.ubuntu.com/772656/

http://pastebin.ubuntu.com/772659/

http://pastebin.ubuntu.com/772661/

http://pastebin.ubuntu.com/772664/

Ошибку выдает

g++ -c test.cpp
g++ -c Btree.cpp
g++ test.o Btree.o
test.o: In function `main':
test.cpp:(.text+0x15b): undefined reference to `Btree<Point, Point>::Btree()'
test.cpp:(.text+0x1a7): undefined reference to `Btree<Point, Point>::Search(Point)'
test.cpp:(.text+0x1da): undefined reference to `Btree<Point, Point>::Add(Point, Point)'
test.cpp:(.text+0x275): undefined reference to `Btree<Point, Point>::Add(Point, Point)'
test.cpp:(.text+0x2c5): undefined reference to `Btree<Point, Point>::Search(Point)'
test.cpp:(.text+0x2ed): undefined reference to `Btree<Point, Point>::Amount_key() const'
test.cpp:(.text+0x312): undefined reference to `Btree<Point, Point>::Clear()'
test.cpp:(.text+0x362): undefined reference to `Btree<Point, Point>::Delete(Point)'
test.cpp:(.text+0x373): undefined reference to `Btree<Point, Point>::~Btree()'
test.cpp:(.text+0x388): undefined reference to `Btree<Point, Point>::~Btree()'
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [a.out] Ошибка 1

Ответ на: Какая? от anonymous111

Re: Какая?

Виноват, невнимательно прочитал ваше сообщение, сегодня я генератор тупняка. Может линковать обектные файлы в другой последовательности? В смысле не <code>test.o Btree.o</code>, а <code>Btree.o test.o</code>

anonymous ()
Ответ на: Увы от anonymous111

Re: Увы

ОП, перемести весь код из Btree.cpp в Btree.h - должно заработать, у меня собралось.

anonymous ()
Ответ на: комментарий от trashymichael

гм

Все правильно же, тем более люди говорят что при копировании в .h все работает. Плюс ошибка одна, специфичная. Странно. Было бы шикарно, если кто-нибудь объяснил бы мне, как скомпилировать 3 файла без переносов.

anonymous111 ()
Ответ на: гм от anonymous111

Re: гм

К своему стыду вынужден признать что я еще ни разу не создавал своих шаблонов. Однако нашел грязный способ чтобы собралось как есть из 3-х файлов:
Нужно добавить в файл Btree.cpp следующую строчку:
static const Btree<Point, Point> tmp;
Взято по мотивам
http://stackoverflow.com/questions/614233/undefined-reference-to-function-tem... (первый ответ). У меня собралось.

anonymous ()
Ответ на: Re: гм от anonymous

Re: гм

Как я понял проблема в том что компилятор в пределах объекта трансляции, использующего шаблон должен видеть конретные типы аргументов шаблона. Т.е. либо инклудить код шаблона в места его использования либо делать как-то так как я написал выше.

anonymous ()
Ответ на: Re: A от anonymous

re:A

tozhe,chto i obychno. zarabotalo pri sovete ukr_unix_user. pri sovete static const Btree<Point, Point> tmp; nuzhno,navernoe,doopredelit Point v h-file, a tak tozhe navernoe.

anonymous111 ()
Ответ на: re:A от anonymous111

Re: re:A

Да-да, забыл сказать, я сразу Point перенес в Btree.h файл. Но инклудить цпп файл не лучшая идея ящитаю.

anonymous ()

реализация шаблонных методов должна быть доступна на стадии компиляции TU, то есть все шаблонные методы должны быть релизованы в .h. 90 % ошибок линковки кода с шаблонами связано с тем, что шаблоны реализованы по привычке в .cpp файле.

alex_custov ★★★★★ ()
Ответ на: комментарий от alex_custov

90 %?! о....ть! 95 должно быть ибо в цпп файлы реализации шаблонов пишут только дебилы недоученые быдлокодеры

anonymous ()
Ответ на: гм от anonymous111

Re: гм

шаблонов в объёктных файлах нет. иди книжки читай.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.