这就是我所拥有的:
struct Foo
{
static std::array<double, 4> acgt_default_background_frequencies() { return {0.281774, 0.222020, 0.228876, 0.267330}; }
};
但我更愿意不使用函数而只是有一个变量,如下所示:
struct Foo
{
static constexpr std::array<double, 4> acgt_default_background_frequencies = {0.281774, 0.222020, 0.228876, 0.267330};
};
我想要的编译,但是当我尝试使用 http://ideone.com/8ku69H Foo::acgt_default_background_frequencies
它给出了链接器错误“对`Foo::acgt_default_background_frequencies'的未定义引用”。
我想做的事情可能吗?我认为,如果我将值内联为常量,而不是将其隐藏在 .cpp 文件中,那么对于标题的读者来说会更清楚,并且使用常量而不是函数似乎也更清晰。 constexpr 的目的不是允许这样的事情吗?如果不可能,为什么不呢?
第二个示例中的内容是宣言 of a static
具有初始值设定项的数据成员,但您尚未提供定义任何地方。如果你做odr-use http://en.cppreference.com/w/cpp/language/definition#ODR-use对于该成员,需要一个定义。
要提供定义,请将以下内容添加到您的 .cpp 文件中
constexpr std::array<double, 4> Foo::acgt_default_background_frequencies;
问题中的声明适用于 C++14,但请注意,在 C++11 中,您需要一组额外的花括号,例如
struct Foo
{
static constexpr std::array<double, AlphabetSize> acgt_default_background_frequencies = {{0.281774, 0.222020, 0.228876, 0.267330}};
};
N3337的相关标准§9.4.2/3 [类.静态.数据]
... A static
文字类型的数据成员可以在类定义中声明constexpr
说明符;如果是这样,其声明应指定大括号或等于初始化器其中每个初始化子句那是一个赋值表达式是一个常量表达式。 ...如果该成员在程序中被 odr 使用(3.2),并且命名空间范围定义不应包含初始化器.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)