Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонный метод, ошибка при линке 
V
    Опции темы
Rickert
Дата 6.10.2007, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Есть класс aPipeLine(не шаблонный!), в котором описан шаблонный метод:
Код
template<class Cls>Cls* apAddNewItem(Cls* work);

И имеющий внутр. переменную:
Код
aWindow* windows

есть глоб. переменная типа aPipeline pipe;
В какой-то момент в программе я вызываю:
Код
pipe.<aWindow>apAddNewItem(pipe.windows)

При линковке выдаёт:
Цитата
Project 555 error LNK2019: unresolved external symbol "public: class aWindow * __thiscall aPipeLine::apAddNewItem<class aWindow>(class aWindow *)" (??$apAddNewItem@VaWindow@@@aPipeLine@@QAEPAVaWindow@@PAV1@@Z) referenced in function "public: void __thiscall aSystem::asInitOGL(void)" (?asInitOGL@aSystem@@QAEXXZ)

Почему?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
archimed7592
Дата 6.10.2007, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Rickert @  6.10.2007,  08:00 Найти цитируемый пост)
pipe.<aWindow>apAddNewItem(pipe.windows)

Может быть так: pipe.apAddNewItem<aWindow>(pipe.windows); ?
Кстати, явно специализировать здесь вообще не нужно - можно просто pipe.apAddNewItem(pipe.windows); .


Цитата(Rickert @  6.10.2007,  08:00 Найти цитируемый пост)
Почему? 

C++-FAQ-Lite пп. [35.12] и [35.13].

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

Это сообщение отредактировал(а) archimed7592 - 6.10.2007, 08:09


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Rickert
Дата 6.10.2007, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Цитата
Может быть так: pipe.apAddNewItem<aWindow>(pipe.windows);

Ну да - да.
Посмотрел ссылки и там действительно решается этот вопрос.
Как я понял, нужно просто перечислять методы реализациия после описания шаблонного метода - так?
То бишь:
Код
template<class Cls>Cls* aPipeLine::apAddNewItem(Cls* work)
{
...
}
//что-то типа template<class Cls> Cls* aPipeLine::apAddNewItem<aWindow>(Cls*);

Так?
Тогда непонятно как это сделать?
Вышеописанная реализация находится в cpp файле, а описание класса в заголовочном. Затем подключается заголовчный файл, заводится глобальная переменная и вызывается метод, как было описано в первом посте. Так?
Но я не могу завести метод для aWindow - как это сделать?

Добавлено через 5 минут и 54 секунды
Всё, разобрался, спасибо!
Реализация должна быть в одном файле с описанием.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
archimed7592
Дата 6.10.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Rickert @  6.10.2007,  08:32 Найти цитируемый пост)
Как я понял, нужно просто перечислять методы реализациия после описания шаблонного метода - так?

Либо так, либо явное инстанцирования(об этом там тоже написано).

Цитата(Rickert @  6.10.2007,  08:32 Найти цитируемый пост)
Тогда непонятно как это сделать?

Я не вижу никакой проблемы в copy-paste из .cpp в .h. А ты? 0_о

Цитата(Rickert @  6.10.2007,  08:32 Найти цитируемый пост)
Но я не могу завести метод для aWindow - как это сделать?

Бред какой-то. Сформулируй свою мысль получше.





--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0422 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.