【发布时间】:2015-07-18 17:51:34
【问题描述】:
我正在编写一个小型玩具项目(数据结构),其中我有一组常量,我想将它们捆绑在一个匿名结构中,该结构位于主类中。这个类使用一些常量来声明静态数组的大小。 它看起来有点像这样:
template< class T, size_t K >
class Tree {
static struct {
size_t const min_keys{ K };
size_t const max_keys{ 2*K };
...
} const constants;
...
};
K是模板参数,struct的所有成员都是const。但是,编译器(我使用的是 g++ 5.1)在声明静态数组时会报错。
bpt.h:34:34: error: size of array is not an integral constant-expression
T keys[constants.max_keys];
这让我很困惑——一切都是const。我只是想清理我的常量,像这样捆绑它们看起来既理想又有趣。使用枚举类也很好,但是由于该类还需要与这些常量进行比较,所以这是不可能的。现在我正在使用一个确实有效的匿名枚举,但这激起了我的好奇心。
这是为什么?这是一个坏主意吗?我对 C++ 很陌生——我很高兴看到替代品。
【问题讨论】:
-
Cannot reproduce -- 获得更好的编译器?
-
这里也一样,您在 MSVS2013 上为我编译的内容。你在用什么?此外,是否有代码用于创建未在此处显示的实例?
-
但是请注意,您可能必须在某些时候为静态常量成员提供定义,并且这样做,如果您不提供类型,您可能会发现说出它的类型很尴尬一个名字。或者,将静态成员设为constexpr,在这种情况下,您也可以将成员值用作常量表达式。
-
@Kerrek SB:你甚至试图重现它。关键在于额外的代码
T keys[constants.max_keys];声明。这就是你必须编译的。 -
@AnT:使用constexpr。并且 OP 的代码不包含有问题的示例!