3

私が書いたら、

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

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

それは私に言うエラーを与えています

エラー C2975: '_Bits': 'std::bitset' のテンプレート引数が無効です。コンパイル時の定数式が必要です

このエラーを解決するにはどうすればよいですか。実行時にビットセットを初期化したいのですが、可能ですか? またはこれを行う他の方法はありますか?

4

4 に答える 4

3

テンプレート パラメーターは、コンパイル時の定数でなければなりません。テンプレートをコード ジェネレーターと考えてください。コンパイルを開始する前に、コードを生成する必要があります。「実行時に」テンプレートを使用することはできません!

const unsigned int size = 10;
std::bitset<size> b;  // fine, the compiler knows what "size is"

unsigned int n; cin >> n;
std::bitset<n> c;     // doesn't make sense!

最初のステップとしてconst、コード内で可能な限り多くのことを記述する必要があります。実際にはコンパイル時の定数がありますが、そのように宣言していない可能性があります。

動的なサイズのデータ​​構造が本当に必要な場合は、別のものを使用する必要があります (たとえば、符号なし char のベクトルとビット単位のアクセサ関数)。


これは、文字のベクトルとして設定されたビットの非常に単純な実装です。私はこれをクラスにラップしていません。必要に応じてそれを行うことができます:

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);
于 2011-08-03T09:25:29.957 に答える
3

あなたの質問に対する標準の回答はstd::vector<bool>、そのサイズに動的に対応できるビットセットである を使用することです。

これは、最もメモリ効率の良い方法でビットを格納できる特殊化でstd::vector<bool>あることを覚えておいてください。(これがひどい理由です:の s のように動作しません。実数の が必要な場合は、できません。)std::vectorstd::vector<T>Tstd::vectorbool

インターフェイスは と同一に保たれますstd::bitset (これもひどいです。 を使用してvectorインスタンス化すると、汎用コードを使用すると地獄が壊れてしまうためbool)、既存のコードが壊れてはなりません。

特殊化は、次のstd::vector<bool>標準で非推奨になります。すでに C++0x を使用している場合、正しい代替手段はstd::dynamic_bitset. 現在の C++ 標準に固執している場合は、それstd::vector<bool>が必要です。

于 2011-08-03T11:35:03.020 に答える
1

必要な場合に使用できboost::dynamic_bitsetます... 動的ビットセット (私は知っています、クレイジーですよね?)。

boost::dynamic_bitset<> bits(8 * sub, bitMask);
于 2011-08-03T10:56:53.293 に答える
0

あなたの場合、constそこに a を貼り付けることができるので、それはconstexpr:

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

std::bitset<8*sub> bits;

(コメントより) 実行時にビットセットを初期化することはできません。それがテンプレート引数、またはコンパイル時の定数である理由です

std::vector別の方法は、いくつかのカスタム アクセス関数を使用してクラスにラップされた bool のa を使用することです。

于 2011-08-03T09:26:47.943 に答える