关于模板类中静态成员变量的问题
- C/C++ code
#include <iostream>#include <map>#include <functional>#include <string>#define DEFINE_CLASS(class_name) char NameArray##class_name[]=#class_name; class class_name:public Register<class_name, NameArray##class_name>//回调函数typedef void* (*CreateFunction)(void);//工厂类class ZFactory{private: //存储类名字和相应的创建对象函数 static std::map<std::string, CreateFunction> m_clsMap;public: static void *getClassByName(std::string name) { std::map<std::string, CreateFunction>::const_iterator find; find = m_clsMap.find(name); if (find != m_clsMap.end()) { return find->second(); } else { return NULL; } } static void RegistClass(std::string name, CreateFunction methond) { m_clsMap.insert(make_pair(name, methond)); }};//类注册class ZRegisterClass {public: ZRegisterClass(std::string name, CreateFunction methond) { ZFactory::RegistClass(name, methond); }};//模板类,具体的实现template <class T, const char name[]>class Register{public: [color=#FF0000] static const ZRegisterClass rc; [/color] Register() { const ZRegisterClass tmp = rc; //ZFactory::RegistClass(name, CreateInstance); } //返回类的实例 static void *CreateInstance() { return new T; } };std::map<std::string, CreateFunction> ZFactory::m_clsMap;[color=#FF0000]template <class T, const char name[]>const ZRegisterClass Register<T, name>::rc(name, Register<T, name>::CreateInstance);[/color]这是网上c++反射的实现,这段代码实现在.cpp文件中
在另一个头文件中使用了extern template Register<int ,pName>导入模板类
请问一下为什么红色的静态成员变量rc不初始化?该怎样改才能使它初始化
[解决办法]
不是不初始化,而是等到 编译器实例化的时候再初始化
[解决办法]
DEFINE_CLASS(class_name) 就是用来往里面加入自己要反射的类,然后 m_clsMap里面就应该有值了,这是一种类名字的映射。
[解决办法]
把调用的代码也贴上来。