为什么在 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 的对象),但您确实需要像这样重复它们的声明。
我无法解释以下内容(使用 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 的对象),但您确实需要像这样重复它们的声明。