Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка Unresolved external  (Прочитано 46651 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Laus
Гость
« : 30-08-2004 15:25 » new

Подскажите, пожалуйста, что обозначают ошибки

[Linker Error] Unresolved external 'TDeck<Body *>::~TDeck<Body *>()' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\РАЗРАБОТКА\ИГРЫ\ЧЕРВЬ\MODWORM.OBJ

[Linker Error] Unresolved external 'TDeck<Body *>::TDeck<Body *>()' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\РАЗРАБОТКА\ИГРЫ\ЧЕРВЬ\MODWORM.OBJ

[Linker Error] Unresolved external 'TDeck<Body *>::AddLeft(Body *)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\РАЗРАБОТКА\ИГРЫ\ЧЕРВЬ\MODWORM.OBJ

и как от них избавиться.

TDeck<Body *> - шаблон дека (стек + очередь)
MODWORM.h (MODWORM.cpp) - разрабатываемый класс, в нём используется описание TDeck<Body *> body.

template <class T> class TDeck
{
  ...
  TDeck();
  ~TDeck();
  void AddLeft(T inf);
  void AddRight(T inf);
  ...
};

Заранее спасибо!!!
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 30-08-2004 15:41 » 

Laus, эти ошибки означают, что ни в объектных файлах, ни в библиотеках не обнаружены тела методов

TDeck<Body *>::~TDeck<Body *>()
TDeck<Body *>::TDeck<Body *>()
TDeck<Body *>::AddLeft(Body *)

В заголовочном файле указаны декларации -- имена методов и типы параметров.  В заголовочном файле отсутствуют тела методов.  Более того, они отсутствуют во всех файлах, которые обработал линкер.  О чём он и сообщил этими ошибками.  Единственный способ их исправить -- написать указанные методы (или найти библиотеку, в которой они реализованы).
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #2 : 31-08-2004 20:18 » 

Тут дело то в чем... видимо реализация этих методов (членов) находится в отдельном (я так подозреваю *.cpp файле) а описание в файле заголовка типа (в *.h файле) но это линьковаться не будет потому как насколько мне известно настоищие компиляторы этого делать НЕ умеют, хотя стандартом это помоему разрешено
Записан

С уважением Lapulya
grozny
Гость
« Ответ #3 : 31-08-2004 21:07 » 

надо тела ф-ций-членов шаблона определять не в отдельном .срр, а рядом с определением шаблона же, в .h. По крайней мере, в визуальном С++ 7.1 всё ещё не понимают членов шаблона в отдельном .срр. Т.к. ф-ции-члены шаблонов связываются на этапе компиляции, а не линковки, то у компилятора должно быть определение этих ф-ций в каждом файле, где используется шаблон. Проще всего добиться этого поместив тело ф-ции-члена прямо в описание шаблона.

Печальное исключение из правил хорошего стиля, напоминающее о том, что шаблоны - суть те же макросы.
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #4 : 31-08-2004 21:37 » 

то grozny, хех
Цитата

надо тела ф-ций-членов шаблона определять не в отдельном .срр, а рядом с определением шаблона же, в .h.

я это и имел ввиду, просто уверенности, что человек допустил именно эту ошибку не было...
а про это
Цитата

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

то стандарту, а точнее коммиссии которая его принимает, глубоко по барабану (ну или почти) все реализации компиляторов и их сложность в узких вопросах (типа этого), поэтому не все что написано в стандарте реализовано.
Записан

С уважением Lapulya
Laus
Гость
« Ответ #5 : 01-09-2004 16:30 » 

В Builder'е 6.0 реализован достаточно удобный интерфейс: в ClassExplorer'е генерируется список всех переменных и функций класса, при этом нажав правую кнопку мыши на названии функции можно переходить к её объявлению или реализации (по выбору). Но это работает только в том случае, если разделить реализацию и объявление функций в одноимённые файлы  *.cpp и *.h соответственно и то не всегда  Улыбаюсь .
Можно обойти эту проблему, если Builder сам генерирует по файлу с заголовком (*.h)  "каркас" для cpp-файла.
Как сделать то же, но руками - не понятно   Так больше нельзя... .
Так что вносить реализацию функций-членов в файл заголовков - не лучший выход.
Записан
godlsd
Гость
« Ответ #6 : 06-08-2009 17:45 » 

Сам пыхтел над этой проблемой... и заметил особенность(BorlandC++)если создавать cpp файл нормальным способом через меню компилятора, а не вручную, то всё прекрасно работает!!!
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #7 : 06-08-2009 17:53 » 

Ага...
....через меню компилятора...
начало не плохое...
Записан

С уважением Lapulya
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines