ошибка: скалярному объекту ‘v’ требуется один элемент в инициализаторе

Привет,

У меня есть простой код, показанный ниже, сохраненный в файл (скажем, stock_portfolio.cxx).

Я пытаюсь скомпилировать это как:
g++ stock_portfolio.cxx

но я получаю следующую ошибку на этапе компиляции:

error: scalar object 'v' requires one element in initializer

У меня есть версия gcc:
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52)

#include<iostream>
#include<vector>
int main() {
std::vector<int>v = {1,2,3,4,5,6};
//std::vector<string> four_star_stocks;
for(int i = 0; i < v.size(); ++i){
std::cout << "Stock S&P: " << v[i] << "\n";
}
std::cout << "========================" << "\n";
std::cout << "Totals   : " << v.size() << "\n";
return 0;
}

3

Решение

инициализация списка была введена в C ++ только в C ++ 11. gcc версии 4.1 не поддерживает C ++ 11 (см. https://gcc.gnu.org/projects/cxx0x.html)

Для меня неясно, спрашиваете ли вы о предлагаемом решении / исправлении или о том, почему ваш код не будет компилироваться.

2

Другие решения

Инициализируйте ваш вектор в цикле, например так:

for(int i = 1; i <= 6; ++i)
v.push_back(i);

Как подсказывает cdhowie, ваша версия gcc не поддерживает список инициализаторов (вам нужна, по крайней мере, версия g ++ 4.4, источник). В случае, если вы получите более новый (добавив флаг -std=c++0x или же -std=gnu++0x), то вы можете увидеть следующее:

std::vector<int> v = {1,2,3,4,5,6};

или же

Если вы хотите сделать это со списком инициализаторов, то вы должны использовать std :: initializer_list следующим образом:

#include <iostream>
#include <vector>
#include <initializer_list>

template <class T>
struct S {
std::vector<T> v;
S(std::initializer_list<T> l) : v(l) {
std::cout << "constructed with a " << l.size() << "-element list\n";
}
void append(std::initializer_list<T> l) {
v.insert(v.end(), l.begin(), l.end());
}
std::pair<const T*, std::size_t> c_arr() const {
return {&v[0], v.size()};  // list-initialization in return statement
// this is NOT a use of std::initializer_list
}
};

template <typename T>
void templated_fn(T) {}

int main()
{
S<int> s = {1, 2, 3, 4, 5}; // direct list-initialization
s.append({6, 7, 8});      // list-initialization in function call

std::cout << "The vector size is now " << s.c_arr().second << " ints:\n";

for (auto n : s.v) std::cout << ' ' << n;

std::cout << '\n';

std::cout << "range-for over brace-init-list: \n";

for (int x : {-1, -2, -3}) // the rule for auto makes this ranged for work
std::cout << x << ' ';
std::cout << '\n';

auto al = {10, 11, 12};   // special rule for auto

std::cout << "The list bound to auto has size() = " << al.size() << '\n';

//    templated_fn({1, 2, 3}); // compiler error! "{1, 2, 3}" is not an expression,
// it has no type, and so T cannot be deduced
templated_fn<std::initializer_list<int>>({1, 2, 3}); // OK
templated_fn<std::vector<int>>({1, 2, 3});           // also OK
}

Источник

0

По вопросам рекламы [email protected]