Класс C ++, членом которого является структура: не может понять ошибку компилятора - PullRequest
1 голос
/ 27 сентября 2011

Я хочу создать класс, один из членов которого private: является struct point (см. Ниже).Открытые члены ndim и numparticles устанавливаются во время выполнения пользователем, которые используются для создания соответствующих массивов внутри класса.Однако я получаю ошибку компилятора.Я не понимаю, где я запутался.

Отображается ошибка компилятора:

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];
              };

};

Ответы [ 3 ]

4 голосов
/ 27 сентября 2011

nbdsearch.h: 31: ошибка: привязка массива не является целочисленной константой до токена ‘]’

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;   
};
1 голос
/ 27 сентября 2011

Есть несколько разных проблем с вашим кодом.

  1. Объявление point должно быть видно компилятору перед его использованием

  2. Вы пытаетесь создать массив из переменных, которые не являются константами времени компиляции;C ++ не позволяет создавать массивы переменной длины.

Чтобы исправить эти проблемы:

  1. Переместите блок объявления на point выше, чем выиспользуй это.Обратите внимание, что поскольку определение point равно private, кто-то, звонящий nbdsearch::particlevec, не сможет сохранить это значение.Все, что они могли сделать, это передать его другой функции-члену (или friend функции) nbdsearch.

  2. Изменить объявление particlevec на std::vector<point> particlevec.Сделайте аналогичное изменение для point::cood.После того как пользователь задает значения для ndim & numparticles, используйте std::vector::resize для правильного определения размера массивов.

1 голос
/ 27 сентября 2011

point необходимо объявить перед использованием. Попробуйте поставить блок private: перед блоком public:.

...