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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: шаблон, отделение реализации от объявления  (Прочитано 5008 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Romires
Новенький

ru
Offline Offline

« : 13-01-2013 14:37 » 

как разбить шаблон на хидер и спп?

Код:
template<class T>
Owner.h
class Owner
{
public:
  void foo(int x);

private:
   int x;
};


Owner.cpp
template<class T> void Owner<T>::foo(int x)
{
  this->x = x;
}

1>task4.obj : error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::~Vector<int>(void)" (??1?$Vector@H@@QAE@XZ) referenced in function "void __cdecl test0(void)" (?test0@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: void __thiscall Vector<int>::remove(int,int)" (?remove@?$Vector@H@@QAEXHH@Z) referenced in function "void __cdecl test0(void)" (?test0@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: void __thiscall Vector<int>::add(int,int &)" (?add@?$Vector@H@@QAEXHAAH@Z) referenced in function "void __cdecl test0(void)" (?test0@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: void __thiscall Vector<int>::push_back(int &)" (?push_back@?$Vector@H@@QAEXAAH@Z) referenced in function "void __cdecl test0(void)" (?test0@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(void)" (??0?$Vector@H@@QAE@XZ) referenced in function "void __cdecl test0(void)" (?test0@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(class Vector<int> &)" (??0?$Vector@H@@QAE@AAV0@@Z) referenced in function "void __cdecl test0(void)" (?test0@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: int __thiscall Vector<int>::size(void)" (?size@?$Vector@H@@QAEHXZ) referenced in function "void __cdecl test0(void)" (?test0@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int)" (??0?$Vector@H@@QAE@H@Z) referenced in function "void __cdecl test0(void)" (?test0@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: __thiscall Vector<struct Unit1>::~Vector<struct Unit1>(void)" (??1?$Vector@UUnit1@@@@QAE@XZ) referenced in function "void __cdecl test1(void)" (?test1@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: __thiscall Vector<struct Unit1>::Vector<struct Unit1>(int)" (??0?$Vector@UUnit1@@@@QAE@H@Z) referenced in function "void __cdecl test1(void)" (?test1@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: void __thiscall Vector<struct Unit1>::add(int,struct Unit1 &)" (?add@?$Vector@UUnit1@@@@QAEXHAAUUnit1@@@Z) referenced in function "void __cdecl test1(void)" (?test1@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: void __thiscall Vector<struct Unit1>::remove(int,int)" (?remove@?$Vector@UUnit1@@@@QAEXHH@Z) referenced in function "void __cdecl test1(void)" (?test1@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: int __thiscall Vector<struct Unit1>::size(void)" (?size@?$Vector@UUnit1@@@@QAEHXZ) referenced in function "void __cdecl test1(void)" (?test1@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: void __thiscall Vector<struct Unit1>::push_back(struct Unit1 &)" (?push_back@?$Vector@UUnit1@@@@QAEXAAUUnit1@@@Z) referenced in function "void __cdecl test1(void)" (?test1@@YAXXZ)
1>task4.obj : error LNK2019: unresolved external symbol "public: __thiscall Vector<struct Unit1>::Vector<struct Unit1>(void)" (??0?$Vector@UUnit1@@@@QAE@XZ) referenced in function "void __cdecl test1(void)" (?test1@@YAXXZ)

у меня пишет ошибки линковки
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 13-01-2013 15:54 » 

Офтопик: где ты там «и» нашел?
http://www.multitran.ru/c/m.exe?CL=1&s=header&l1=1

В заголовок выделают те части, которые необходимы для компиляции модуля без линковки. Заголовок должен быть совместим с собственным и сторонним модулями: компилируемые типы данных не должны отличаться.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

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

« Ответ #2 : 13-01-2013 17:55 » new

Romires, вопрос неоднократно поднимается начинающими, не понимающими суть шаблона. В новых стандартах языка обещали что-то сделать, в старых: никак - весь код шаблона должен находиться в h-файле.

RXL, а есть у нас FAQ соответствующий? Проще будет один раз написать и потом ссылку постить сходу, чем каждый раз пытаться объяснять с начала.

P.S. И кстати, а где у нас FAQ. Вроде я что-то такое видел когда-то, а теперь в упор не нахожу.
« Последнее редактирование: 13-01-2013 17:57 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

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

WWW
« Ответ #3 : 13-01-2013 19:25 » 

Дим, можно просто сделать тему в нужном разделе и прикрепить ее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines