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必须在编译时知道。另一种方法是使用 astd::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++ 中不允许使用可变长度数组,即直到运行时才知道大小的数组。

另一种方法是使用模板,例如:

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

或者,类似地,使用std::array,如std::array<bool,10> vals;

于 2012-10-31T12:49:58.947 回答
1

在大多数情况下,使用 astd::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构造函数,考虑到切换到 bitset,它现在可能有意义,也可能没有意义,现在可以按如下方式使用该对象:

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

这里N在编译时是未知的。如果您创建 aob1,ob2,ob3那么所有三个对象都有可能具有不同的值,N这违反了 c++(可变长度数组)的定律。

使用const int N=5;或制作 N 作为类变量static int foo::N=6;

于 2012-10-31T12:52:25.857 回答