我想在继承期间存储有关类名的一些其他信息:
#define CLASS_TO_STRING(name) #name
class IBase {};
template <typename T>
struct BaseManager
{
static const char* MANAGER_TAG = CLASS_TO_STRING(T);
};
std::map<const char*, IBase*> mManagers;
template <typename T>
void addManager(BaseManager<T>* manager)
{
mManagers[T::MANAGER_TAG] = manager;
}
因此,当我使用从
addManager
继承的某些类型的对象调用BaseManager
时,会收到错误消息,指出BaseManager<TYPENAME>::MANAGER_TAG
未定义。我了解问题的原因,但不知道如何解决。 最佳答案
您可以将const char*
更改为constexpr
,但恐怕您从CLASS_TO_STRING(T)
中得到的全部是T
(至少g ++在输出上给了我T-那是因为预处理程序在编译和模板实例化之前运行)。
也应该代替T::MANAGER_TAG
,而应BaseManager<T>::MANAGER_TAG
。并且您的BaseManager应该从IBase继承,如果:
mManagers[BaseManager<T>::MANAGER_TAG] = manager;
应该工作。
出现错误的原因是我认为静态数据成员的类内初始化仅适用于const整数类型。
关于c++ - 带模板的静态变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21814003/