我正在尝试初始化一个类变量数组。据我了解,正常的类变量初始化是这样的:
class test
{
public:
static const float f;
};
但是,作为一个数组,它突然不起作用:
class test
{
public:
static const float f[2];
};
//const float test::f = { 1 ,2};
整个代码应该可以工作,但我注释掉了第 6 行。在第 4 行,它仍然扔了
错误LNK2001未解析的外部符号"public:静态浮点常量 * 常量测试::F">
我尝试了指针和动态分配,两者都不起作用。如何修复此错误,第 6 行有问题吗?
解释
static
test::f
意味着f
不绑定到类实例test
。换句话说,只有一个单一的f
就像test
namespace
,而不是class
。只有一个而且正好有一个f
.
注意
另外,您忘记添加必须在编译时给出的数组f
大小。您也可以始终使用decltype
说明符,该说明符将自动为您提供正确类型的成员。
基本示例
#include <iostream>
class test
{
public:
static const float f[2];
};
decltype(test::f) test::f = {1, 2};
int main(){
// Outputs: 1, 2
std::cout << test::f[0] << ", " << test::f[1];
}
现代示例
更现代的解决方案将使用std::array
、初始值设定项列表、auto
占位符类型说明符和constexpr
说明符。在这种情况下,您根本不需要提供数组大小。
#include <iostream>
#include <array>
class test
{
public:
static constexpr auto f = std::array {1.f, 2.f};
};
int main(){
// Outputs: 1, 2
std::cout << test::f[0] << ", " << test::f[1];
}
正如@NathanOliver所说,您可以在类之外将大小添加到初始化中:
class test
{
public:
static const float f[2];
};
...
const float test::f[2] = {1, 2};
或者,您也可以使用 constexpr
并在类本身中声明数组:
class test
{
public:
static constexpr float f[2] = {1, 2};
};