templates + static data + DLLs
От: Sergeem Израиль  
Дата: 29.12.02 18:24
Оценка:
Не знаю, правильно ли я попал, ибо эти
проблемы связаны сугубо с wndows dll и
VC 6.0.

Словом, имеются следующие классы
(все сильно утрировано ) :

struct Mummy
{
    Mummy() {puts("mummy ctor");}
    ~Mummy() {puts("mummy dtor");}
};


template <class C>
struct Templ
{
    static int *foo();
private:
    static int i;
};

template <class C>
int *Templ<C>::foo() 
{
    static Mummy mum;
    return &i;
}

template <class C>
int Templ<C>::i = 0;


Все юзают Templ из разных dll-ек, ожидая получить
один и тот же результат ф-ции foo, которая возвращает
адрес статического члена класса, для одних и тех же
instantiations (как бы это по русски?) класса Templ<C>.
Все бы хорошо, но когда выбираем опцию вставки
inline-функций в код, то это не работает. Очевидно,
экземпляр Templ<TheClass>::i вставляется в каждую dll.

Чтобы пофиксить такой непорядок, я экспортирую
instantiations шаблона Templ<C> для конкретных
классов С, которые у меня используются. Т.е.
экземпляр Templ<TheClass>::i теперь находится
в TheClass.dll, и все с радостью его юзают.
Типа так:

TheClass.h :  extern template struct THECLASSDLL_API ::Templ<TheClass>;

TheClass.cpp: int Templ<TheClass>::i = 0;


Первая проблема: таких классов TheClass довольно много,
и нужно перелопатить кучу кода, да и к тому же это дело
надо окружать #ifdef-ом, потому как это ms-specific
extension, а код — multi-platform.

Вторая проблема: тело функции foo надо вставлять внутрь
класса Templ, иначе не компилируется. Это не очень
желательно, поскольку foo довольно больших размеров.

Третья проблема: не вызывается конструктор Mummy!!???
Пофиксино путем переноса mum в члены класса Templ.

Спрашивается — есть ли какие-то обходные маневры для
решения этих проблем.

ЗЫ. Спасибо, если дочитали до конца
Serge.

Hасколько проще была бы жизнь, если бы она была в исходниках.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.