1

クラスの横に構造体を定義しました。メンバーの1つは、指定されたサイズの配列です。

class foo {
private:
  int N;
  struct entry {
    uint64_t pc;
    uint64_t offset;
    bool pattern [N];
  };
public:
  void bar()
  {
   entry en;
   en.pc = 1;
   en.offset = 2;
   en.pattern[en.pc] = 1;
  }
};

しかし、エラーは

error: invalid use of non-static data member ‘N’
4

5 に答える 5

4

C++は可変長配列をサポートしていません。Nコンパイル時に認識されている必要があります。別の方法は、代わりに使用するstd::vectorことです。

class foo {
private:
  int N;
  struct entry {
    uint64_t pc;
    uint64_t offset;
    std::vector<int> pattern;
  };
public:
  void bar()
  {
   N = 100; //don't forget to initialize N
   entry en;
   en.pc = 1;
   en.offset = 2;
   en.pattern.resize(N);
   en.pattern[en.pc] = 1;
  }
};
于 2012-10-31T12:46:59.277 に答える
2

Nサイズは、コンパイル時に認識されている必要があります。あなたがそのように作るならば、static const int N=5それはコンパイルするでしょう。

于 2012-10-31T12:47:48.823 に答える
2

配列を初期化するには、コンパイル時の既知の積分定数を使用する必要があります。あなたがstatic const int N=10;言ったなら、それはうまくいっただろうと言ってください。

可変長配列、つまり実行時までサイズがわからない配列は、C++では許可されていません。

これを行うもう1つの方法は、テンプレートを使用することです。例:

template<int N>
struct my_struct {
    bool vals[N];
};

または、同様に、のようにを使用std::arraystd::array<bool,10> vals;ます。

于 2012-10-31T12:49:58.947 に答える
1

std::vectorほとんどの場合、固定長の配列よりもを使用することをお勧めします。この場合、とにかく許可されていないコンパイル時のサイズがわかりません。のコレクションであることを考えると、の配列よりもはるかにサイズ効率の高いboolを検討することをお勧めします。std::bitsetbool

template < int S >
class foo {
private:
  int N;
  struct entry {
    uint64_t pc;
    uint64_t offset;
    std::bitset<S> pattern;
  };
public:
  entry en;
  foo()
  {
    en.pc = 1;
    en.offset = 2;
    en.pattern[en.pc] = 1;
  }
};

コンストラクターを追加したことに注意してくださいfoo。これは、ビットセットへの切り替えを考えると意味がある場合と意味がない場合があり、オブジェクトは次のように使用できます。

foo<24> myBits;
于 2012-10-31T13:04:06.507 に答える
0

ここでNは、コンパイル時には不明です。を作成するob1,ob2,ob3と、3つのオブジェクトすべての値が異なる可能性がありN、c ++(可変長配列)の法則に違反します。

const int N=5;クラス変数としてNを使用または作成しますstatic int foo::N=6;

于 2012-10-31T12:52:25.857 に答える