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

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

ru
Offline Offline

« : 17-03-2004 10:43 » new

Как из одного cpp файла вызвать функцию, шаблон которой описан в другом файле ?

у меня в VS6 линкер в упор не видит функцию, хотя оба файла компилируются нормально.
А если я начну все кидать в 1 файл, то там в сплошной мешанине через неделю уже сам ничего ничего не пойму, да вообще его уже сейчас листать неудобно...
Записан

1n c0de we trust
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 17-03-2004 10:56 » 

Mayor, под шаблоном ты имеешь ввиду прототип или что?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #2 : 18-03-2004 13:37 » 

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

#include "Templatefunction.h"
#include "Templatefunction.cpp"

ну а для красоты можно файл Templatefunction.cpp назвать TemplatefunctionImplementation.h, ну и получить более приемлимое

#include "Templatefunction.h"
#include "TemplatefunctionImplementation.h"

или как вариант заинклудить TemplatefunctionImplementation.h внутри Templatefunction.h

это все относится к тому если я правильно понимаю проблему, а понимаю я ее так....

хеадер Templatefunction.h и там следующее

template <class T>
void f(T *);

далее есть Templatefunction.cpp файл в котором следующее

template <class T>
void f(T * value)
{
......
}

и еще есть такой файлец client.cpp в котором примерно это

#include "Templatefunction.h"

...
int value;
f<int>(&value);
...
Записан

С уважением Lapulya
Serega
Гость
« Ответ #3 : 19-03-2004 09:34 » 

Так сделать нельзя, код шаблонной функции должен быть виден на этапе компиляции, поэтому все шаблонные функции должны быть в .h файлах

Файл можно рабить не несколько, и инклудить их
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #4 : 19-03-2004 13:18 » 

Serega это ты кому Mayor или мне
Записан

С уважением Lapulya
Serega
Гость
« Ответ #5 : 20-03-2004 09:23 » 

lapulya, а ты пробовал свой пример скомпилить ? Ага
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #6 : 21-03-2004 21:52 » 

Serega, да, я специально ради тебя только что попробовал откомпилировать свой пример - ошибок нет.  Работает КАК ЧАСЫ!!! Могу выслать все исходники этого огромного проекта  Отлично. А пока - лог компиляции:

------ Build started: Project: TemplateTest, Configuration: Debug Win32 ------

Compiling...
main.cpp
Linking...

Build log was saved at "file://c:\Documents and Settings\**********\My Documents\TemplateTest\Debug\BuildLog.htm"
TemplateTest - 0 error(s), 0 warning(s)


---------------------- Done ----------------------

    Build: 1 succeeded, 0 failed, 0 skipped
Записан

С уважением Lapulya
Serega
Гость
« Ответ #7 : 22-03-2004 07:52 » 

Все правильно, ты инклудишь все в один файл
я увидел .cpp и не подумал что ты его иклудишь
просто у нас так не принято, .cpp это отдельный модуль компиляции
Записан
Anchorite
Гость
« Ответ #8 : 23-03-2004 19:22 » 

Не знаю  как в других компиляторах, а в MSVC разорвать описание шаблона функции и ее реализацию не получится.
Да и как вы себе это представляете?
Что компилятор должен будет поместить в объектный файл?
Сдается мне что все это всего-лишь попытка сделать типизированный препрцессор.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #9 : 26-03-2004 02:28 » 

Вроде бы я нашел решение даного вопроса :

в модулях где происходит вызов конкретной функции нужно ее объявить , тогда все скомпилируется без проблем :

template <class T>
void F(T* );

естественно, это не получится слинковать , тк линкер не найдет реализации функций , поэтому в самом конце модуля шаблонов нужно дать явные указания компилятору по каждой функции, типа :
template void F<int*>(int *);

Конечно, это кривой метод, но он мог бы быть полезен когда в проекте больше одного модуля и реализация многих шаблонов занимает больше 500-700 байт ( ну или кб кому сколько важно Улыбаюсь)) , вот только MS пишет :

When a function template is first called for each type, the compiler creates an instantiation. Each instantiation is a version of the templated function specialized for the type. This instantiation will be called every time the function is used for the type. If you have several identical instantiations, even in different modules, only one copy of the instantiation will end up in the executable file.

Т.е. если я это правильно понял, можно с теми же результатами оптимизации воспользоваться:

Цитата

Так сделать нельзя, код шаблонной функции должен быть виден на этапе компиляции, поэтому все шаблонные функции должны быть в .h файлах

Файл можно рабить не несколько, и инклудить их


С другой стороны  по размеру obj файлов видно , что компилятор генерит в каждом модуле реализацию шаблона,
 и у меня есть сомнения, в том  что линкер вырезает одинаковый код из разных модулей перед сборкой их в один exe файл.  
 
 
 В общем, есть у кого опыт сборки больших проектов с шаблонами Не понял
 
 Или мне предется уточнить свои сомнения посредством  SoftICE/IDA ?
Записан

1n c0de we trust
Доброжелатель
Гость
« Ответ #10 : 26-03-2004 06:23 » 

Цитата: lapulya
Точно не помню, но помоему стандартом это допускается, НО!!! я еще не видел реализацию компилятлора который смогбы это сделать

 Улыбаюсь Есть такое чудо на свете комилятор Comeau. Он поддерживает модель разделения шаблонов.

Цитата: lapulya
#include "Templatefunction.h"
#include "Templatefunction.cpp"

ну а для красоты можно файл Templatefunction.cpp назвать TemplatefunctionImplementation.h, ну и получить более приемлимое

#include "Templatefunction.h"
#include "TemplatefunctionImplementation.h"


Далать так имеет смысл, если вы потом заимеете компиялтор поддерживающий export шаблонов. Ага

Цитата: Mayor
С другой стороны по размеру obj файлов видно , что компилятор генерит в каждом модуле реализацию шаблона,
и у меня есть сомнения, в том что линкер вырезает одинаковый код из разных модулей перед сборкой их в один exe файл.


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

Если компиляция занимает длительное время есть два выхода:
1. перейти на компилятор поддерживающий экспорт шаблонов.
2. явное инстанцирование шаблонов.
1-й более предпочтителен.

PS Чтобы не было вопросов по данной тематике достаньте книжку "Шаблоны C++. Справочник разработчика" Д.Вандевурд Н.М. Джосьютис, заверяю не пожалеете Ага
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #11 : 27-03-2004 02:32 » 

Цитата

PS Чтобы не было вопросов по данной тематике достаньте книжку "Шаблоны C++. Справочник разработчика" Д.Вандевурд Н.М. Джосьютис, заверяю не пожалеете

 
его можно скачать ?

я только не понял VC 6 поддерживает неявный экспорт шаблонов или нет ?
Записан

1n c0de we trust
Доброжелатель
Гость
« Ответ #12 : 27-03-2004 09:13 » 

Цитата: Mayor

его можно скачать ?
нет ?


здесь посмотри
но она на английском, хотя это и к лучшему Ага , так же советую сходить на сайт автора книги, там приведён список ошибок

Цитата: Mayor

я только не понял VC 6 поддерживает неявный экспорт шаблонов или  

Да он не то что экспорт, он даже частичную специализацию  не поддерживает  Ха-ха-ха
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #13 : 28-03-2004 02:20 » 

Цитата

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

 
согласен к лучшему

заскакивал я как-то на этот сайт но он к сожалению не поддерживает поиск ,да и я тогда интересовался только архитектурой NT 5 ,

спасибо уже скачивается

Сайт Автора наверное в книге указан

Цитата

Да он не то что экспорт, он даже частичную специализацию не поддерживает


те мне приется явно все шаблоны в один модуль скидывать ....
Записан

1n c0de we trust
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines