类外的静态变量实例化

所以我有这个文件

template <typename T>
class TestStatic {
public:
    static int staticVal;
};

//static member initialization
template<typename T> int TestStatic<T>::staticVal;

我不明白为什么我必须实例化Staticval是不是已经在类定义中实例化了?它还为每种模板参数类型生成一个静态变量吗?

提前致谢。

评论
  • Norma
    Norma 回复

    由于声明为static的变量仅在分配给单独的静态存储中的空间时才初始化一次,因此,类中的static变量由对象共享。对于不同的对象,不能有相同静态变量的多个副本。同样由于这个原因,不能使用构造函数来初始化静态变量。

    Please refer for more information: Reference

  • 怪我瞎i
    怪我瞎i 回复

    这行:

    static int staticVal;
    

    类内部是声明,而不是定义。这就是为什么您必须像这样在类外定义它:

    template<typename T> 
    int TestStatic<T>::staticVal = 0;
    

    And yes, this will generate a definition of the member for all types T.

    另外,您可以定义静态变量内联,如下所示:

    template <typename T>
    class TestStatic {
    public:
       inline static int staticVal = 0;
    };
    

    它具有与上述相同的语义,但让我们避免必须在类外部单独定义静态变量。