我试图在类范围内初始化成员vec
,但编译器抛出了一个更隐蔽的错误。
class A {
public:
static const size_t sz = 10;
static const std::vector<double> vec{ sz }; // error
};
编译器(gcc(给出以下错误:
error: in-class initialization of static data member 'std::vector<double> A::vec' of non-literal type
10 | static std::vector<double> vec{ sz };
| ^~~
error: non-constant in-class initialization invalid for non-inline static member 'A::vec'
10 | static std::vector<double> vec{ sz };
| ^
note: (an out of class initialization is required)
我该怎么解决这个问题?
通常,静态数据成员可能不会在类主体中初始化。但是,我们可以为仅为const
限定的积分类型的静态成员提供类内初始值设定项。如果使用非整数静态成员,并且需要提供类内初始值设定项,则数据成员应为constexpr
文字类型。在任何情况下,初始值设定项都必须是常量表达式。如果成员的类型不是文字类型(因此不能使用constexpr
(,则静态成员不应具有默认的成员初始值设定项,相反,它可以在类之外定义。
所以你的错误只是因为std::vector<double>
是非积分型的。此外,不能将vec
声明为constexpr,因为std::vector<double>
不是文字类型。
所以要修复上面的例子,你可以这样做:
class A {
public:
static const size_t sz = 10;
static const std::vector<double> vec;
};
const std::vector<double> A::vec{ sz };
(演示(
正如在通信网中指出的,请注意,使vec
const
-合格,将丢失一些向量特征。例如,添加任何元素后都不能修改它!