为什么编译器(VC ++)不允许(错误C2975)
const int HASH[] = {24593, 49157};
bitset<HASH[0]> k;
我该怎么做才能克服这个问题(用数组中的常量值初始化模板)?
答案 0 :(得分:3)
本地const
对象不能作为常量表达式,但std::bitset<N>
要求非类型模板参数N
为常量表达式。具有初始值设定项的const
整数对象确实有资格作为常量表达式。在所有其他情况下,您需要constexpr
(我不知道MSVC ++是否支持constexpr
)。例如:
#include <bitset>
struct S { static int const member = 17; };
int const global_object = 17;
int const global_array[] = { 17, 19 };
int constexpr global_constexpr_array[] = { 17, 19 };
int main()
{
int const local = 17;
int const array[] = { 17, 19 };
int constexpr constexpr_array[] = { 17, 19 };
std::bitset<S::member> b_member; // OK
std::bitset<global_object> b_global; // OK
std::bitset<global_array[0]> b_global_array; // ERROR
std::bitset<global_constexpr_array[0]> b_global_constexpr_array; // OK
std::bitset<local> b_local; // OK
std::bitset<array[0]> b_array; // ERROR
std::bitset<constexpr_array[0]> b_constexpr_array; // OK
}
所有这一切,你确定你真的想拥有一个std::bitset<N>
数组指定的元素数量吗?如果你真的对价值的某些部分感兴趣,你宁愿使用这样的东西:
std::bitset<std::numeric_limits<unsigned int>::digits> k(HASH[0]);