не создается статический объект, описанный в классе-шаблоне
От: afkos  
Дата: 04.09.05 19:00
Оценка:
Здравствуйте, никак не могу решить проблему в следующем коде (макет), не вызывается конструктор класса A, кажется что статический объект класса B просто не воплощается... подскажите как лучше всего решить эту проблему?

struct A { 
    A() {
         MessageBox(NULL, "A", "A", MB_OK);     
    }
};

template <class T> struct B {
    B() {}
    static A a;
};
template<class T> A B<T>::a;

struct C : public B<C> {
    C(){}
};
Re: не создается статический объект, описанный в классе-шабл
От: Павел Кузнецов  
Дата: 04.09.05 19:44
Оценка: 25 (3)
afkos,

> Здравствуйте, никак не могу решить проблему в следующем коде (макет), не вызывается конструктор класса A, кажется что статический объект класса B просто не воплощается... подскажите как лучше всего решить эту проблему?

>
> struct A {
>     A() {
>          MessageBox(NULL, "A", "A", MB_OK);     
>     }
> };
>
> template <class T> struct B {
>     B() {}
>     static A a;
> };
> template<class T> A B<T>::a;
>
> struct C : public B<C> {
>     C(){}
> };
>


B<C>::a, как и любая другая статическая переменная шаблона, не будет инстанцирован до тех пор, пока к нему не будет обращения или пока не будет явного запроса на инстанцирование. Соответственно, нужно сделать или то, или другое. Например:
struct A {
     A() {
          MessageBox(NULL, "A", "A", MB_OK);
     }
};

template <class T> struct B {
     B() { (void)&B<T>::a; }
     static A a;
};
template<class T> A B<T>::a;

struct C : public B<C> {
     C(){}
};
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.