【发布时间】:2017-11-15 18:35:52
【问题描述】:
我想用一个类的常量静态变量来声明一个数组成员变量的长度。如果我这样做:
// A.h
#include <array>
using namespace std;
class A {
array<int,LENGTH> internalArray;
public:
const static int LENGTH;
};
// A.cpp
#include "A.h"
constexpr int A::LENGTH{10};
在声明 internalArray 时,A.h 中出现错误:“'LENGTH' 未在此范围内声明”。
我觉得很奇怪,因为一个类成员变量,即 LENGTH,怎么会超出类的范围?我发现的唯一解决方法是将初始化从 A.cpp 移动到 A.h:
// A.h
#include <array>
using namespace std;
constexpr int LENGTH{10};
class A {
array<int,LENGTH> internalArray;
public:
const static int LENGTH;
};
但据我了解,首先这是两个不同的变量:全局命名空间范围 LENGTH 和类范围 LENGTH。此外,在 .h(A 类之外)中声明一个变量将在每个包含标头的翻译单元中创建一个独立的 LENGTH 对象。
有没有办法用静态类范围变量指定数组的长度?
【问题讨论】:
-
为什么类成员变量<...>超出了类内部的范围因为编译器是自上而下读取文件的。如果某个名称在它看到时未声明 - 会引发错误。而且,很明显,
LENGTH低于它的首次使用。 -
您可能需要在标题中定义
LENGTH的值(以及在数组定义的上方);没有它,A实例的大小除了A.cpp之外的任何人都无法使用,这使得其他任何人都无法实例化您的类(否则他们怎么知道要为实例保留多少内存?)。您是否尝试过按照the guidelines here 定义它?这适用于 C 风格的数组,但想法相同;您需要为LENGTH定义一个值才能将其用作编译时常量。 -
@Algirdas Preidžius 你说得对,我必须先声明 LENGTH。
-
@Vlad 来自莫斯科,你说得对,我必须先声明 LENGTH。
-
@ShadowRanger 感谢您提供的信息,我必须完成一些代码,然后看看您的链接。
标签: c++ c++11 constexpr stdarray