难道是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 出来
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 出来