Проблема C ++ в объявлении структуры - PullRequest
3 голосов
/ 20 сентября 2011

Я не вижу, что не так в следующем (очень надуманном) коде. Возможно, я объявил вектор размера 2 внутри mystruct. Но не так ли мы объявляем вектор размера 2, содержимое которого нам еще предстоит инициализировать?

struct mystruct
{
  int a;
  int b;
  vector<double> c(2);    };

   int main(int argc, char *argv[])
{
  mystruct test;
  (test.c)[0]=3.4;
  (test.c)[1]=1.8;
  return 0;    }

Компилятор выдает мне следующее сообщение об ошибке:

g ++ -Wall simple.cpp

simple.cpp: 18: ошибка: ожидаемый идентификатор перед числовой константой

simple.cpp: 18: ошибка: ожидается ‘,’ или ‘...’ перед числовой константой

simple.cpp: в функции int main (int, char **) ’:

simple.cpp: 32: ошибка: недопустимые типы ‘[int]’ для массива подстрочный

simple.cpp: 33: ошибка: недопустимые типы ‘[int]’ для индекса массива

Ответы [ 5 ]

6 голосов
/ 20 сентября 2011

Вы не можете инициализировать mystruct::c в определении класса, это должно быть сделано в конструкторе.

struct mystruct {
  mystruct() : c(2) { }
  vector<double> c;
};
2 голосов
/ 20 сентября 2011

Это не совсем так, как работает C ++.

Когда вы объявляете класс, вы не можете указывать конструкторы для объектов-членов (за исключением статических константных интегралов).Вместо этого вы должны указать аргументы конструктора для членов в списке инициализатора конструктора класса:

class Foo
{
  std::vector<int> v;
public:
  Foo() : v(2) { }
};
2 голосов
/ 20 сентября 2011

Вам нужен конструктор, если вы хотите инициализировать вектор (конструктор вектора вызова)

struct mystruct
{
  int a;
  int b;
  vector<double> c;

  mystruct():
    c(2)
    {

    }
};
2 голосов
/ 20 сентября 2011

Вы пытаетесь создать c в вашей декларации struct. Векторы имеют только размер при построении. Попробуйте:

struct mystruct {
    mystruct(): c(2) {}
    int a;
    int b;
    vector<double> c;
};

Конструктор mystruct() использует синтаксис инициализации члена c(2) для построения c.

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

Это недопустимое объявление:

vector<double> c(2);

Возможно, вы захотите:

vector<double> c;

Затем в основном:

int main(int argc, char *argv[])
{
     mystruct test;
     test.c.push_back(3.4);
     test.c.push_back(1.8);
     return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...