带有模板的静态变量
Static variable with templates
我想在继承期间存储一些关于类名的其他信息:
#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;
}
因此,当我使用从BaseManager
继承的某些类型对象调用addManager
时,我收到一个错误,指出BaseManager<TYPENAME>::MANAGER_TAG
未定义。我了解问题的原因,但不知道如何解决。
除了 marcin_j 关于类内初始化的评论(它仅适用于 C++11 并且对于非整数类型,它需要 constexpr),真正的问题是:
static const char* MANAGER_TAG = CLASS_TO_STRING(T);
当预处理器解析此行时,CLASS_TO_STRING会将 T 转换为字符串文字"T"。这里真正发生的事情是预处理器(执行宏替换的那个)完全不知道模板系统,并且 T 是一个模板参数。这里需要一种不同的方法。
你可以
const char*
更改为constexpr
但恐怕你从CLASS_TO_STRING(T)
得到的只是T
(至少 g++ 在输出上给了我 T - 那是因为预处理器在编译和模板实例化之前运行)。
也不要T::MANAGER_TAG
,你应该BaseManager<T>::MANAGER_TAG
。并且您的基本经理应该从IBase继承,如果:
mManagers[BaseManager<T>::MANAGER_TAG] = manager;
应该工作。
您收到错误的原因是我认为静态数据成员的类内初始化仅适用于 const 整型。
相关文章:
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 模板基类中的静态变量
- 类和静态变量
- 不同作用域中的静态变量和全局变量
- 静态变量声明和定义
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 在类中继承静态变量?
- "local scope"中的 C++ 初始化静态变量
- 使用静态变量的递归调用的不同输出
- 复制文件流C++静态变量
- 跨模板化函数编译的静态变量
- C++编译器是否优化了顺序静态变量读取?
- C++,每个循环初始化一个新的静态变量
- (为什么)我们可以在初始化中将非静态类成员分配给静态变量吗?
- 这些语句是否等效(静态变量、常量变量和泛型)
- 程序如何知道静态变量是否需要初始化?
- 类外的静态变量实例化
- 无法解析静态变量
- 函数局部静态变量:从性能角度来看的优点/缺点
- 访问从 CPP 文件到其他头文件的静态变量