难道是GCC巨大的BUG,模板类的静态成员无法调用构造函数?解决方案

难道是GCC巨大的BUG,模板类的静态成员无法调用构造函数?
A为模板类,其中有一个静态成员s类型为B。GCC编译、运行都成功,但是无法调用B的构造函数。
而静态变量s1却可以正常的初始化。
为什么对象的构造函数不能执行呢?

#include   <iostream>
#include   "h.h "
int   main()  
{
A <string>   objA(111);
 
}

h.h:
****************************************************
#ifndef   POOL_H_INCLUDED_GF
#define   POOL_H_INCLUDED_GF
#include   <iostream>
#include   "s.h "
using   namespace   std;
template   <typename   T>    
class   A
{
public:
int   a1;
A(int   a1)
{
this-> a1=a1;
cout < < "init   A " < <endl;
cout < < "sizeof   T   = " < <sizeof(T) < <endl;
cout < < "s1= " < <A::s1 < <endl;
}
 
static   int   s1;
static   B   s;
};

template   <typename   T>   int   A <T> ::s1=1234;
template   <typename   T>     B   A <T> ::s;

#endif


s.h
*****************************************************
#ifndef   SH
#define   SH
#include   <iostream>
using   namespace   std;
class   B
{
public:
int   m1;
B()
{
cout < < "init   static   0 " < <endl;
}
};
#endif


------解决方案--------------------
你的代码我用VS2005测试了一下也同样没有调用
但是main中写上
A <string> ::s;这样,静态成员变量就会正常初始化成功。
似乎跟编译的策略有关系。不算是编译器的bug
------解决方案--------------------
B这个类只有一个实例s,而s并没有被使用(只是定义了)
因此整个类B被优化掉了
------解决方案--------------------
上下文没有用到就被编译器优化了
如果把A的构造函数改称:
A(int a1)
{
this-> a1=a1;
cout < < "init A " < <endl;
cout < < "sizeof T = " < <sizeof(T) < <endl;
cout < < "s1= " < <A::s1 < <endl;
cout < < "B= " < <A::s.m1 < <endl;
}
同时B构造中初始化m1就可以看到满意的结果了
------解决方案--------------------
编译器不会进行不必要的具现化,编译器也不会执行不必要的构造初始化
------解决方案--------------------
模板就是这样,没有用到的东西不会实例化出来啊。


template <typename T> B A <T> ::s;
这个模板并没有实例化一个 B A <string> ::s 出来