Полная генерация шаблонного класса
От: Костян Россия  
Дата: 09.11.05 08:35
Оценка:
Как заставить компилятор (MSVC 7.1) генерировать код всех функций-членов шаблонного класса, а не только тех, которые используются в программе?
Re: Полная генерация шаблонного класса
От: Аноним  
Дата: 09.11.05 08:38
Оценка:
Здравствуйте, Костян, Вы писали:

К>Как заставить компилятор (MSVC 7.1) генерировать код всех функций-членов шаблонного класса, а не только тех, которые используются в программе?


Можно создать экземпляр такого шаблонного класса.
Возможно будет даже достаточно указателя...
Re: Полная генерация шаблонного класса
От: Bell Россия  
Дата: 09.11.05 08:41
Оценка: 2 (1) +2
Здравствуйте, Костян, Вы писали:

К>Как заставить компилятор (MSVC 7.1) генерировать код всех функций-членов шаблонного класса, а не только тех, которые используются в программе?


С помощью явного инстанциирования:

template <class T>
class test
{
   T t;
public:
   T get() const { return t; }
};

template class test<int>;
Любите книгу — источник знаний (с) М.Горький
Re[2]: Полная генерация шаблонного класса
От: Костян Россия  
Дата: 09.11.05 08:52
Оценка:
Здравствуйте, Bell, Вы писали:

B>С помощью явного инстанциирования:


B>
B>template <class T>
B>class test
B>{
B>   T t;
B>public:
B>   T get() const { return t; }
B>};

B>template class test<int>;
B>


Спасибо.

А я считал, что

typedef class test<int>   int_test;
,

тоже является явным инстанциированием...
Re: Полная генерация шаблонного класса
От: Glоbus Украина  
Дата: 09.11.05 09:11
Оценка:
Здравствуйте, Костян, Вы писали:

К>Как заставить компилятор (MSVC 7.1) генерировать код всех функций-членов шаблонного класса, а не только тех, которые используются в программе?


К примеру можно так

template<class T>
class CTest 
{
public:
    void IntErrF()
    {
        int a = "0";
    }

    ~CTest()
    {
        &CTest<T>::IntErrF;
    }
};


Так как деструктор генерится всегда, то в нем нужно указать такие вот строчки. Правда при добавлении нового метода придется дописывать строку в деструктор.
Вопрос: а зачем генерить функции, которые не используются?
Удачи тебе, браток!
Re[2]: Полная генерация шаблонного класса
От: Костян Россия  
Дата: 09.11.05 09:24
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Вопрос: а зачем генерить функции, которые не используются?


Дело в том, что специализации шаблонного класса экспортируются из dll. В коде самой dll, все функции-члены этого шаблонного класса не используются, и в клиенте, использующем эту dll получаем unresolved external, при попытке использовать такие, не инстационированные функции.
Re[2]: Полная генерация шаблонного класса
От: ArtDenis Россия  
Дата: 09.11.05 09:26
Оценка: +2
B> С помощью явного инстанциирования:

Для полной уверенности того, что компилятор сгенерирет код всех функций, надо указать компилятору, что класс class test<int> предназначен для экспорта в dll.
Posted via RSDN NNTP Server 1.9
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Полная генерация шаблонного класса
От: remark Россия http://www.1024cores.net/
Дата: 11.11.05 19:11
Оценка: 3 (1)
Здравствуйте, Костян, Вы писали:

К>Здравствуйте, 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.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Полная генерация шаблонного класса
От: np9mi7 Россия  
Дата: 11.11.05 20:38
Оценка:
Здравствуйте, Костян, Вы писали:

К>Дело в том, что специализации шаблонного класса экспортируются из dll. В коде самой dll, все функции-члены этого шаблонного класса не используются, и в клиенте, использующем эту dll получаем unresolved external, при попытке использовать такие, не инстационированные функции.


А зачем шаблоны в *.dll?
"В любое мгновение принятия решения, лучшее, что вы можете сделать, это принять правильное решение; следующим лучшим вариантом будет принять неправильное решение, худший вариант – не принимать решения совсем" (c) Теодор Рузвельт.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.