为什么在 C++ 模板中,将 vector<T> 成员变量声明为 static 会产生链接器错误,而 inline static 则不会?

Why in a C++ template, declaring a vector<T> member variable as static will produce linker error but inline static will not?

我无法解释以下内容(使用 C++20 规则)

//FooTemplate.h
template<typename T>
class FooTemplate {
private:
   static std::vector<T> t; //linker error.
   //inline static std::vector<T> t; --> will not produce linker error
   //static T t; -->this works also with the appropriate changes in the following code
public:
    static void setT(T t1)
    {
        t.push_back(t1);
    }
    static T getT(int i)
    {
        return t.at(i);
    }
};
//main.cpp
#include"FooTemplate.h"
int main() {
  FooTemplate<Foo>::setT(Foo{});
  FooTemplate<Foo>::getT(0);
}

我必须内联静态成员 t 才能使其正常工作。如果我不使用模板化容器(例如定义 T t 而不是 vector<T> t 它也可以工作。

有什么想法吗?

静态成员必须在 class 之外定义(初始化)。

简单的写在你的实现中:

template<class T> std::vector<T> FooTemplate<T>::t = [some initializer];

编辑:您实际上不需要显式初始化它们(除非它们是没有默认构造函数的 class 的对象),但您确实需要像这样重复它们的声明。