数组大小的 C++ 编译时规范

C++ Compile time specification of array size

我正在尝试创建一个结构来在 header 文件的 class 的声明部分中保存文件 header。这涉及计算在编译时已知的值,我想用它来调整 header.

中的数组大小

这是我最近一直在尝试的 header 文件的摘录:

const   uint    hFreeSiz    =   (1024 - sizeof(uint32_t) - sizeof (uint16_t)- sizeof (uint16_t) - sizeof(RId))/sizeof (RId);
template <const uint freedSiz>
struct  FBHead
{
    /** A magic number for the file.  Indicates both class and version. */
    uint32_t    fSig;
    /** The number of data bytes within each block. */
    uint16_t            blkSize;
    /** The number of records available for reuse.  */
    uint16_t            freedCnt;
    /** The id number of the last record written to the file.   */
    RId lstRec;
    RId freedRecs[freedSiz];
};
FBHead<hFreeSiz>    fbHead;

但它告诉我:

error: invalid use of non-static data member 'FBFile::hFreeSiz'

我可以手工计算,但我想了解这里发生了什么 为什么这不起作用。谁能解释一下? (我猜如果我移动了 class 之外的常量声明,那么它会起作用,但我真的宁愿 让它靠近它用来修改的东西。事实上,如果这是唯一的 回答,然后我可能会计算 手工制作并评论为什么 具体号码。)

现代方法是使用 constexpr,告诉编译器它是一个实际的编译时常量。看一个更简单的例子:

constexpr int Size = sizeof(long) * 7;

class Foo
{
    int t[Size];
};

class Foo
{
    static constexpr int Size = sizeof(long) * 7;
    int t[Size];
};