Ошибка при инициализации vector<string>

254
25 декабря 2017, 13:24

Добрый день! Я студент технического вуза и самостоятельно пытаюсь выучить c++. Что пытаюсь сделать :

Что у меня в IDE:

    int main()
{
    vector<string> philosopher = { "Kant", "Plato","Hume","Kierkegaard" };
    return 0;
}

Что показывает мне компилятор на попытку собрать решение:

Мои #include:

#include<iostream>
#include<fstream>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<string>
#include<list>
#include<vector>
#include<algorithm>
#include<stdexcept>

Я могу просто определить вектор строк и с помощью метода push.back() добавить туда строку. Но вот так создать вектор у меня не получается, хотя вышеуказанный пример из книги Страуструпа. Я что-то делаю не так?

Заголовочный файл - книжный. Автор книги говорит добавлять его во все программы и потом объяснить его назначение. Ссылка - введите сюда описание ссылки

Answer 1

Вот как оно должно выглядеть

// прекомпилированный заголовочный файл (в студии используется по-умолчанию)
// должен быть первым
#include "stdafx.h"
// все инклюды, требуемые этому файлу, перечисляются прямо в этом файле, а не где-то еще
#include <string>
#include <vector>
int main()
{
    ::std::vector< ::std::string > philosopher = {"Kant", "Plato", "Hume", "Kierkegaard"};
    // альтернативный вариант
    // чтобы нормально подхватить vector и string не указывая префикс каждый раз
    using namespace std;
    vector<string> philosopher = {"Kant", "Plato", "Hume", "Kierkegaard"};
    return 0;
}
Answer 2

В том заголовочном файле, который вы используете, Страуструп подменяет вектор своим - он кое-чем отличается, в частности, он генерирует исключения при выходе за границы в операторе [].

Так вот, в этом его классе нет конструктора, который умеет работать со списком инициализации.

В тексте Страуструп показывает работу со стандартным вектором.

Answer 3

У вас наблюдается мешанина из современной книги по С++ (С++11 и позже) и старинных заголовочных файлов, не совместимых с современным С++ (написаны для С++98-С++03). Обратите внимание на комментарий в файле: "Revised April 25, 2010". В то время как вы пытаетесь использовать свойство языка, которое появилось только в 2011 году.

Ошибка возникает из-за

#define vector Vector

во включенном вам заголовочном файле. При этом интерфейс суррогатного класса Vector грубо не соответствует современным требованиям языка. Страуструп в свое время сильно "напортачил" с этим std_lib_facilities.h, что вызвало большое количество ошибок и вопросов. Старайтесь избегать учебных курсов по современному С++, опирающихся на этот std_lib_facilities.h.

READ ALSO
Как изменить текст элемента управления static?

Как изменить текст элемента управления static?

Сначала получал дескриптор статика и использовал setwindowtext, но почему-то не робит

207
Надо ли писать два двоеточия перед std?

Надо ли писать два двоеточия перед std?

Некоторые авторы используют два двоеточия ("::") перед неймспейсом std, например:

231
Прочитать полностью wchar_t с памяти

Прочитать полностью wchar_t с памяти

Autoit работает хорошо, но c++ читает первый символ, как быть?

218
winform в c++ с библиотекой boost

winform в c++ с библиотекой boost

Ребят, помогите разобраться? Имеется допустим простой код:

203