Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=7677298&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 19:31:11 2016
Кодировка: Windows-1251
[C++] Разные определения шаблона - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
vozbu
karamba

Рег.: 14.11.2004
Сообщений: 4856
Рейтинг: 1057
  [C++] Разные определения шаблона
      01.07.2008 14:29
-1

Добрый день.

Решил сделать сборку проекта с динамическими библиотеками под Windows, для этого перед большинством классов (кроме шаблонных или совсем маленьких встраиваемых) поставил макрос типа MY_LIB_EXPORT, который в зависимости от типа сборки определяется либо в "", либо в "__declspec(dllexport)", либо в "__declspec(dllimport)" (без кавычек, разумеется). В общем, классика.
Но вот вопрос:
есть библиотека A, она определяет class A_EXPORT Image, и еще в ней есть класс такого типа:
 
code:
class A_EXPORT UseImage { public: UseImage(); template<class T> UseImage(const T&); };

и есть включаемый файл с реализацией шаблона, который надо включать в код по мере надобности:
 
code:
template <class T> A::UseImage::UseImage(const T&) { Image i; // SMTH }


Теперь получается, что если я использую этот шаблонный конструктор внутри библиотеки A, то у меня в определении шаблона подразумевается __declspec(dllexport) Image, а если в другой библиотеки или программе, то там уже __declspec(dllimport) Image. На практике пока все собралось и отработало без косяков, но чревато ли это какими-либо проблемами?

На эти мысли меня навело вот что: в тестах проверяется этот конструктор, и раньше я файл с реализацией шаблона в тесты не включал. Выходило так, что шаблон использовался внутри A, там инстанциировался и потом в тестах использовалась готовая инстанция. А теперь, когда я сделал динамическую сборку, тесты не собрались без этой реализации, т.е. в тестах происходит еще одно инстанцирование.



С тех пор, как изобрели речь, люди не могут договориться друг с другом.
Xanderus
экстеоретик

Рег.: 25.04.2006
Сообщений: 1365
Из: Уже не в В
Рейтинг: 370
  Re: [C++] Разные определения шаблона [re: vozbu]
      02.07.2008 03:09
 

Теоретически проблемы могут быть, но они, скорее всего, несущественны:
1. Если в шаблонной функции есть статические переменные, то они тоже продублируются (с соответствующими побочными эффектами).
2. Дублирование тела шаблонной функции приведет у увеличению суммарного объема библиотеки и использующего ее файле, а именно, одна инстанция будет в библиотеке, другая - в использующем ее файле, хотя их код будет, скорее всего, идентичен.

Больше пока ничего в голову не приходит.

junkie
journeyman

Рег.: 07.03.2005
Сообщений: 52
Рейтинг: 15
  Re: [C++] Разные определения шаблона [re: vozbu]
      02.07.2008 13:32
 

На самом деле когда ты разделил все на библиотеки компилятор всегда пытается импортировать все методы класса, а не генерировать код. После этого линкер должен ругаться мол нет такого метода. Решение следующие: класс целиком не экспортируем, а экспортируем отдельные методы.

Вообще шаблоны зло.

vozbu
karamba

Рег.: 14.11.2004
Сообщений: 4856
Рейтинг: 1057
  Re: [C++] Разные определения шаблона [re: junkie]
      02.07.2008 14:08
 

В ответ на:

Решение следующие: класс целиком не экспортируем, а экспортируем отдельные методы.



Это не решит моей проблемы с шаблоном, насколько я понимаю, т.к. из dll все равно можно получить только то, что явно экспортируется, а экспортировать шаблон я не могу, есессно. Разве что написать что-то типа __declspec(dllexport) template A::UseImage::UseImage<конкретный тип>() чтобы попытаться экспортировать инстанциированный шаблон с конкретным параметром. Надо попробовать.



С тех пор, как изобрели речь, люди не могут договориться друг с другом.
Mike
Ызарг

Рег.: 02.11.2002
Сообщений: 8098
Рейтинг: 2147
  Re: [C++] Разные определения шаблона [re: vozbu]
      02.07.2008 14:14
 

Quote:

чтобы попытаться экспортировать инстанциированный шаблон с конкретным параметром



А зачем это нужно? Если посмотреть, то многие библиотеки boost работают с шаблонами и линкуются как dll-и без проблем. Я не понял, в чем у тебя возникла ошибка в тестах. Ты создавал и использовал конкретный код внутри библиотеки. Если ты создаешь шаблон в другом месте, то все функции, которые использует этот шаблон, должны быть видны. По-другому это не работает, хотя действительно можно экспортировать конкретные специализации шаблонов.

vozbu
karamba

Рег.: 14.11.2004
Сообщений: 4856
Рейтинг: 1057
  Re: [C++] Разные определения шаблона [re: Mike]
      02.07.2008 14:47
 

В ответ на:

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



Вообще-то - работает. Если он был инстанцирован в какой-либо библиотеке A, то использовать его в другой библиотеке или программе, которая линкуется к A, можно и без определения шаблона. Я на эту тему несколько экспериментов проводил с gcc со статической и с динамической сборками. В Visual Studio это тоже работает, раз работало до сих пор. Не работает только с .dll, т.к. там экспортируется только то, что ты явно скажешь.



С тех пор, как изобрели речь, люди не могут договориться друг с другом.
Mike
Ызарг

Рег.: 02.11.2002
Сообщений: 8098
Рейтинг: 2147
  Re: [C++] Разные определения шаблона [re: vozbu]
      02.07.2008 17:52
 

Quote:

Вообще-то - работает.


Не работает при динамической линковке. Мы же об этом говорим.

junkie
journeyman

Рег.: 07.03.2005
Сообщений: 52
Рейтинг: 15
  Re: [C++] Разные определения шаблона [re: vozbu]
      02.07.2008 18:06
 

Писать надо так
code:
class UseImage { public: A_EXPORT UseImage(); template<class T> UseImage(const T&); }; // тут твои шаблонные методы или в другом файле, который сюда включишь


vozbu
karamba

Рег.: 14.11.2004
Сообщений: 4856
Рейтинг: 1057
  Re: [C++] Разные определения шаблона [re: junkie]
      02.07.2008 19:33
 

В ответ на:

Писать надо так




Я не настолько туп, чтобы не понять, что означает
 
В ответ на:

Решение следующие: класс целиком не экспортируем, а экспортируем отдельные методы.







С тех пор, как изобрели речь, люди не могут договориться друг с другом.
vozbu
karamba

Рег.: 14.11.2004
Сообщений: 4856
Рейтинг: 1057
  Re: [C++] Разные определения шаблона [re: Mike]
      02.07.2008 19:35
 

В ответ на:

Не работает при динамической линковке. Мы же об этом говорим.



А, ок, это верно.

Вообще, проблема не из того раздута. То, что определения должны быть видны, я понял в тот момент, когда у меня не собрался проект :))

Вопрос топика состоял в разных определениях шаблона и не в чем более.



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

Technical >> Development (Archive)

Дополнительная информация
1 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

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

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в