我想在继承期间存储有关类名的一些其他信息:

#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/

10-13 09:40