【问题标题】:C++ class whose member is a struct: Cannot understand compiler error成员为结构的 C++ 类:无法理解编译器错误
【发布时间】:2011-11-25 16:06:12
【问题描述】:

我想创建一个类,其中private: 成员是struct point(见下文)。公共成员ndimnumparticles 是 由用户在运行时设置,用于在类中创建相应的数组。但是我收到编译器错误。我不明白我在哪里搞砸了。

正在显示的编译器错误:

nbdsearch.h:25: error: ‘point’ does not name a type
nbdsearch.h:24: error: invalid use of non-static data member ‘nbdsearch::ndim’
nbdsearch.h:31: error: from this location
nbdsearch.h:31: error: array bound is not an integer constant before ‘]’ token

类代码:

class nbdsearch{
 public: 
  int ndim,numparticles;
  point particlevec[numparticles];


 private: 
  struct point{
    string key;
    double cood[ndim];
              };

};

【问题讨论】:

    标签: c++ class struct compiler-errors


    【解决方案1】:

    nbdsearch.h:31: error: array bound is not an integer constant before ‘]’ token

    double cood[ndim];
    

    数组大小需要是一个编译时间常数,ndim 显然不是。 ndim 是一个变量。

    错误:“点”没有命名类型

    point particlevec[numparticles];
    

    在第 25 行,编译器不知道 point 是什么。该结构将在稍后定义。 C++ 中的编译器采用自上而下的方法(不确定 C++0X 是否放宽了此规则)。因此,它应该事先知道所使用的类型。

    试试这个 -

    class nbdsearch{
     private: 
      struct point{
        string key;
        std::vector<double>cood;
      };
     public: 
        int ndim,numparticles;
        std::vector<point> particlevec;   
    };
    

    【讨论】:

    【解决方案2】:

    point 需要在使用前声明。尝试将private: 块放在public: 块之前。

    【讨论】:

    • 我认为在一个班级中,公共部分和私人部分的顺序无关紧要。
    • 对于函数和成员来说,这往往是正确的。另一方面,类型总是必须在使用前至少前向声明。
    【解决方案3】:

    您的代码存在一些不同的问题。

    1. point 的声明需要在编译器之前可见 你用它

    2. 您正在尝试从不是编译时常量的变量创建数组; C++ 不允许创建可变长度数组。

    解决这些问题:

    1. point 的声明块移到您使用它的地方。请注意,由于point 的定义是private,因此调用nbdsearch::particlevec 的人将无法存储该值。他们所能做的就是将它传递给nbdsearch 的另一个成员函数(或friend 函数)。

    2. particlevec 的声明更改为std::vector&lt;point&gt; particlevec。对point::cood 进行类似的更改。一旦用户指定了 ndimnumparticles 的值,请使用 std::vector::resize 适当地调整数组大小。

    【讨论】:

    • C99 的特性是支持自动(即本地非静态)存储类的变长数组。不是可变大小的成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2017-01-15
    相关资源
    最近更新 更多