Вопрос по vector, g++, c++ – Ошибка времени компиляции C ++: ожидаемый идентификатор перед числовой константой

31

Я читал другие подобные посты, но я просто не понимаю, что я сделал неправильно. Я думаю, что мое объявление векторов правильно. Я даже пытался объявить без размера, но даже это не работает. Что не так?  Мой код:

#include <vector> 
#include <string>
#include <sstream>
#include <fstream>
#include <cmath>

using namespace std;

vector<string> v2(5, "null");
vector< vector<string> > v2d2(20,v2);

class Attribute //attribute and entropy calculation
{
    vector<string> name(5); //error in these 2 lines
    vector<int> val(5,0);
    public:
    Attribute(){}

int total,T,F;

};  

int main()
{  
Attribute attributes;
return 0;
}
@ Ajay: ужасное понятие,std библиотека является частью C ++, вы должны научиться использовать их вместе. KillianDS
Что вы пытаетесь сделать с5 а также0 в ваших звонках наvector конструктор? Вот что означают аргументы:cplusplus.com/reference/stl/vector/vector Michael Graczyk
Я просто пытался использовать: явный вектор (size_type n, const T & amp; value = T (), const Allocator & amp; = Allocator ()); как показывает ваша ссылка: vector & lt; int & gt; второй (4100); user1484717
@KillianDS, библиотеки не являются частью языка (IMO), они просто стандартизированы.printf а такжеcout не являются понятиями языка, они приходят из библиотеки. И я хотел сказать, что он / она должен сначала изучить основы! Ajay

Ваш Ответ

3   ответа
2

вероятно, еще не поддерживает весь C ++ 11, который поддерживает аналогичный синтаксис, вы получаете эти ошибки, потому что вам нужно инициализировать членов вашего класса в конструкторах:

Attribute() : name(5),val(5,0) {}
Предоставленный синтаксис не будет работать вC++11 либо толькоbrace-or-equal инициализация разрешена при объявлении переменной.
54

vector<string> name(5); //error in these 2 lines
vector<int> val(5,0);

в классе за пределами метода.

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

class Foo {
    vector<string> name = vector<string>(5);
    vector<int> val{vector<int>(5,0)};
};

До C ++ 11 вам нужно сначала объявить их, а затем инициализировать, например, в конструкторе

class Foo {
    vector<string> name;
    vector<int> val;
 public:
  Foo() : name(5), val(5,0) {}
};
Какой компилятор поддерживает этот "C ++ 11"? особенность ?
@Jason Внутри метода в классе есть одно из мест, где вы можете это сделать. Вы также можете сделать это в функции, не являющейся членом, или при объявлении, например, глобальной переменной.
Хорошо, спасибо! У меня есть GCC 4.6 в Windows, которая не поддерживает это. VC11 также не поддерживает это.
@ Ajay GCC с 4.7 см.here, вероятно, последний лязг. Не уверен, каков график выпуска VS, но я слышал, что новейшая версия будет поддерживать все функции.
@Jason Идея состояла в том, чтобы сделать невозможной ситуацию, когда объявление элемента данных может быть проанализировано как функция. Цикл "самый неприятный разбор".
6

(...) в теле класса не допускается. использование{..} или же= ..., К сожалению, так как соответствующий конструкторexplicit а такжеvector имеет конструктор списка инициализатора, вам нужно функциональное приведение для вызова нужного конструктора

vector<string> name = decltype(name)(5);
vector<int> val = decltype(val)(5,0);

В качестве альтернативы вы можете использовать списки инициализатора конструктора

 Attribute():name(5), val(5, 0) {}

Похожие вопросы