vozbu
|
karamba
|
|
|
|
Рег.: 14.11.2004
|
Сообщений: 4856
|
|
Рейтинг: 1057
|
|
[C++] Разные определения шаблона
01.07.2008 14:29
|
|
|
Добрый день.
Решил сделать сборку проекта с динамическими библиотеками под 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<конкретный тип>() чтобы попытаться экспортировать инстанциированный шаблон с конкретным параметром. Надо попробовать.
|
С тех пор, как изобрели речь, люди не могут договориться друг с другом.
 |
|
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
|
|
|
В ответ на:
Не работает при динамической линковке. Мы же об этом говорим.
А, ок, это верно.
Вообще, проблема не из того раздута. То, что определения должны быть видны, я понял в тот момент, когда у меня не собрался проект )
Вопрос топика состоял в разных определениях шаблона и не в чем более.
|
С тех пор, как изобрели речь, люди не могут договориться друг с другом.
 |
|