所以我有这个文件
template <typename T>
class TestStatic {
public:
static int staticVal;
};
//static member initialization
template<typename T> int TestStatic<T>::staticVal;
我不明白为什么我必须实例化Staticval,它不是已经在类定义中实例化了吗?它还为每种模板参数类型生成一个静态变量吗?
提前感谢。
此行:
static int staticVal;
该类内部是声明,而不是定义。这就是为什么您必须像这样在类外定义它:
template<typename T>
int TestStatic<T>::staticVal = 0;
是的,这将为所有类型T
生成成员的定义。
或者,您可以像下面这样定义内联静态变量:
template <typename T>
class TestStatic {
public:
inline static int staticVal = 0;
};
具有与上述相同的语义,但让您避免在类外定义静态变量。
由于声明为静态的变量仅在它们在单独的静态存储中分配空间时才初始化一次,因此,类中的静态变量由对象共享。对于不同的对象,不能有相同静态变量的多个副本。也由于这个原因,静态变量无法使用构造函数进行初始化。
请参考以获取更多信息:Reference