Как заставить компилятор (MSVC 7.1) генерировать код всех функций-членов шаблонного класса, а не только тех, которые используются в программе?
Re: Полная генерация шаблонного класса
От:
Аноним
Дата:
09.11.05 08:38
Оценка:
Здравствуйте, Костян, Вы писали:
К>Как заставить компилятор (MSVC 7.1) генерировать код всех функций-членов шаблонного класса, а не только тех, которые используются в программе?
Можно создать экземпляр такого шаблонного класса.
Возможно будет даже достаточно указателя...
Здравствуйте, Костян, Вы писали:
К>Как заставить компилятор (MSVC 7.1) генерировать код всех функций-членов шаблонного класса, а не только тех, которые используются в программе?
С помощью явного инстанциирования:
template <class T>
class test
{
T t;
public:
T get() const { return t; }
};
template class test<int>;
Здравствуйте, Костян, Вы писали:
К>Как заставить компилятор (MSVC 7.1) генерировать код всех функций-членов шаблонного класса, а не только тех, которые используются в программе?
К примеру можно так
template<class T>
class CTest
{
public:
void IntErrF()
{
int a = "0";
}
~CTest()
{
&CTest<T>::IntErrF;
}
};
Так как деструктор генерится всегда, то в нем нужно указать такие вот строчки. Правда при добавлении нового метода придется дописывать строку в деструктор.
Вопрос: а зачем генерить функции, которые не используются?
Здравствуйте, Glоbus, Вы писали:
G>Вопрос: а зачем генерить функции, которые не используются?
Дело в том, что специализации шаблонного класса экспортируются из dll. В коде самой dll, все функции-члены этого шаблонного класса не используются, и в клиенте, использующем эту dll получаем unresolved external, при попытке использовать такие, не инстационированные функции.
Для полной уверенности того, что компилятор сгенерирет код всех функций, надо указать компилятору, что класс class test<int> предназначен для экспорта в dll.
Здравствуйте, Костян, Вы писали:
К>Здравствуйте, Glоbus, Вы писали:
G>>Вопрос: а зачем генерить функции, которые не используются?
К>Дело в том, что специализации шаблонного класса экспортируются из dll. В коде самой dll, все функции-члены этого шаблонного класса не используются, и в клиенте, использующем эту dll получаем unresolved external, при попытке использовать такие, не инстационированные функции.
Если известны все случаи как будет инстанциироваться щаблон (с), то самый адекватный способ — явным инстанциированием:
template class MyTemplateClass<UserClass1>;
template class MyTemplateClass<UserClass2>;
template class MyTemplateClass<UserClass3>;
...
template class MyTemplateClass<UserClassN>;
Если, все случаи не известны, то (на данный) никак (для с++).
Можно описания тел шаблонов вынести в .h файлы, но тогда они фактически не будут иметь отношения к .dll.
Здравствуйте, Костян, Вы писали:
К>Дело в том, что специализации шаблонного класса экспортируются из dll. В коде самой dll, все функции-члены этого шаблонного класса не используются, и в клиенте, использующем эту dll получаем unresolved external, при попытке использовать такие, не инстационированные функции.
А зачем шаблоны в *.dll?
"В любое мгновение принятия решения, лучшее, что вы можете сделать, это принять правильное решение; следующим лучшим вариантом будет принять неправильное решение, худший вариант – не принимать решения совсем" (c) Теодор Рузвельт.