问题例子:
文件A.h
class RTTI
{
RTTI(int aa):a(aa){};
private:
int a;
}
template<class T, class Base>
class SupportRTTI : public Base
{
public:
SupportRTTI();
virtual ~SupportRTTI();
// virtual RTTI *GetRTTI(){ return &m_sRTTI;}
public
static RTTI m_sRTTI;
}
template<class T, class Base>
RTTI SupportRTTI<T, Base>::m_sRTTI(10)
文件A.cpp
template<class T, class Base>
SupportRTTI<T, Base>::SupportRTTI()
{
}
template<class T, class Base>
SupportRTTI<T, Base>::~SupportRTTI()
{
}
文件B.h
class Object{};
class MyTest : public SupportRTTI<MyTest, Object>
{
public:
MyTest();
~MyTest()
}
编译器在连接的时候 会无法解析
SupportRTTI<MyTest, Object>::SupportRTTI() //MyTest 会调 父类的构造
这个构造函数。
因为在编译的B.h , (include "A.h") ; 传了SupportRTTI<MyTest, Object> 就生成了 新的构造和析构函数的声明,
但是 没有去重新生成他的实现(A.cpp)
所以用模板 要把模板对应的实现也放在头文件中, 这样 就会生成 对应模板参数的声明和实现。
另一问题:
我们把实现也放在头文件后,就可以链接成功了。
但是 运行后 发现static RTTI m_sRTTI 静态变量 m_sRTTI没有被初始化
原因在于:
代码 中要是没有显示的用到这个m_sRTTI静态成员变量 就不会被初始化
只要我们在SupportRTTI类里加上类似这样的 接口 virtual RTTI *GetRTTI(){ return &m_sRTTI;}
m_sRTTI静态成员变量 就会被初始化