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

conanfans 2007-09-03 03:54:51
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
...全文
285 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
conanfans 2007-09-04
  • 打赏
  • 举报
回复
问题已解决了。
www_adintr_com 2007-09-03
  • 打赏
  • 举报
回复
模板就是这样,没有用到的东西不会实例化出来啊。


template <typename T> B A<T>::s;
这个模板并没有实例化一个 B A<string>::s 出来
this_ 2007-09-03
  • 打赏
  • 举报
回复
编译器不会进行不必要的具现化,编译器也不会执行不必要的构造初始化
this_ 2007-09-03
  • 打赏
  • 举报
回复
上下文没有用到就被编译器优化了
如果把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就可以看到满意的结果了
p_zyh 2007-09-03
  • 打赏
  • 举报
回复
B这个类只有一个实例s,而s并没有被使用(只是定义了)
因此整个类B被优化掉了
  • 打赏
  • 举报
回复
你的代码我用VS2005测试了一下也同样没有调用
但是main中写上
A<string>::s;这样,静态成员变量就会正常初始化成功。
似乎跟编译的策略有关系。不算是编译器的bug
conanfans 2007-09-03
  • 打赏
  • 举报
回复
这段程序在WIN平台下运行完成正常。
在LINUX+GCC下就异常了。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧