C++ 如何克服位集错误

C++ 如何克服位集错误,c++,binary,bitset,C++,Binary,Bitset,如果我写 int a=10,b=12; int sub = b-a; std::bitset<8*sub> bits(bitMask); inta=10,b=12; int sub=b-a; std::位集位(位掩码); 这给了我一个错误的说法 错误C2975:“_位”:std::bitset”的模板参数无效, 应为编译时常量表达式 如何克服这个错误,我想在运行时初始化位集,有可能吗? 还有其他方法吗?模板参数必须是编译时常量。将模板视为代码生成器:必须在开始编译之前生成代码。

如果我写

int a=10,b=12;
int sub = b-a;

std::bitset<8*sub> bits(bitMask);
inta=10,b=12;
int sub=b-a;
std::位集位(位掩码);
这给了我一个错误的说法

错误C2975:“_位”:std::bitset”的模板参数无效, 应为编译时常量表达式

如何克服这个错误,我想在运行时初始化位集,有可能吗?
还有其他方法吗?

模板参数必须是编译时常量。将模板视为代码生成器:必须在开始编译之前生成代码。您不能“在运行时”使用模板


在您的情况下,您可以将一个
const
粘贴在那里,使其成为
constepr

const int a=10,b=12;
const int sub = b-a;

std::bitset<8*sub> bits;
const int a=10,b=12;
常数int sub=b-a;
std::位集位;

(来自注释)不能在运行时初始化位集;这就是为什么它是一个模板参数,或编译时常量

另一种方法是使用bools的
std::vector
,它被包装在一个带有一些自定义访问函数的类中

,如果您想要。。。动态位集(我知道,疯狂吧?)

boost::动态位集位(8*sub,位掩码);

解决您问题的标准是使用
std::vector
,这是一个可以动态调整其大小的位集

请记住,
std::vector
std::vector
专门化,允许以最有效的内存方式存储位。(这就是它糟糕的原因:对于其他
t
s,它的行为不像
std::vector
。如果你想要一个真正的
std::vector
bool
,你不能。)

该接口与
std::bitset
保持一致(这也很糟糕,因为使用
vector
的通用代码如果使用
bool
实例化,将破坏地狱),因此您现有的代码不应该破坏


在下一个标准中,
std::vector
专门化将被弃用。如果您已经在使用C++0x,正确的替代方法是
std::dynamic_位集
。如果你被当前的C++标准所束缚,那么<代码> STD::vector < /C>是你想要的。< /P>什么是<代码>子< /代码>?我打赌这是一个变量。您能提供一些围绕
变量的代码吗?您不能在运行时初始化位集;这就是为什么它是一个模板参数,或者编译时常量@Schnommus:如何克服这个问题。。有其他选择吗?我试着添加常量,根本不需要。。我所发布的相同错误是Apparingwell,发布一些真实的代码。如果使所有数字都保持不变,则上述示例应该有效。const int sub=Count ErrorByte+1;std::位集位(位掩码);我的评论中的上述代码无效:(所有东西都必须是常量,包括
Count
ErrorByte
!我尝试添加常量,但根本不起作用..我发布的错误是相同的,在你的代码中一定有一些东西不是
constexpr
。这里的代码在我这方面编译得很好。基本上只是说“constant expr”的简短方式Session';它将在C++0x中作为一个关键字引入,以保证语句是常量表达式
constexpr
在VC10中不受支持。您正在使用哪个编译器?上面给出的代码(具有“const”)编译得很好。
std::vector<unsigned char> data;

bool getBit(size_t n, const std::vector<unsigned char> & data)
{
  if (data.size() * CHAR_BIT) <= n) return 0;

  return data[n / CHAR_BIT] & (1U << (n % CHAR_BIT));
}

void setBit(size_t n, std::vector<unsigned char> & data)
{
  if (data.size() * CHAR_BIT) <= n) data.resize(n / CHAR_BIT + 1, 0);

  data[n / CHAR_BIT] |= (1U << (n % CHAR_BIT));
}

// Exercise for the reader
void clrBit(size_t n, std::vector<unsigned char> & data);
void tglBit(size_t n, std::vector<unsigned char> & data);
const int a=10,b=12;
const int sub = b-a;

std::bitset<8*sub> bits;
boost::dynamic_bitset<> bits(8 * sub, bitMask);