Мозгоправ
|
||||||
1 | ||||||
Инициализация константного вектора списком инициализации24.11.2020, 05:53. Показов 2655. Ответов 13
Метки нет (Все метки)
Есть вот такая программка:
Однако, это нужно откомпилить с toolset v110 (Visual Studio 2012). Получаю ошибку: Код
1>------ Build started: Project: test-05, Configuration: Debug x64 ------ 1>main.cpp 1>main.cpp(9): error C2552: 'vec' : non-aggregates cannot be initialized with initializer list 1> 'std::vector<_Ty>' : Types with a base are not aggregate 1> with 1> [ 1> _Ty=MethodMark 1> ] 1>Done building project "CodeTest-05.vcxproj" -- FAILED. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== Я в общем эту проблему обошёл, но вопросы остались: всё-таки почему ошибка? и как сделать оптимально?
0
|
24.11.2020, 05:53 | |
Ответы с готовыми решениями:
13
Ошибка при инициализации вектора списком Инициализация константного члена класса с проверкой значения Инициализация константного статического объекта - члена класса Возможна ли инициализация в инициализации? |
1563 / 484 / 105
Регистрация: 17.05.2015
Сообщений: 1,472
|
|
24.11.2020, 11:01 | 3 |
В неполном объёме, и с кучей всевозможных багов.
Таблица поддержки стандартов с++ Технически, поддержку "uniform initialization" (MSDN) добавили в ноябрьский копилятор Visual C++ Compiler November 2012 CTP Вооружившись ноябрьским компилятором, вы уже сможете изготавливать собственные классы с использованием этой фичи. Однако в стандартные классы поддержку initializer_list ещё не успели завести. Поэтому, std::vector фича попрежнему недоступна. Итого: вам нужна минимум Visual Studio 2013.
1
|
Комп_Оратор)
|
||||||||||||||||
24.11.2020, 14:41 | 4 | |||||||||||||||
L0M, я не совсем понял как к проблеме относится код:
Так или иначе - вектор нельзя использовать как constexpr и в С++20. Тогда, чем плох такой код?
Добавлено через 2 часа 34 минуты если вектор реально не маленький можно диспетчеризовать по типу
1
|
Мозгоправ
|
||||||
24.11.2020, 14:44 [ТС] | 5 | |||||
Спасибо за ответы!
Скорее всего именно тут собака порылась Студия-то у меня 2019-я. Но для конкретно этого проекта мне приходится устанавливать в свойствах проекта toolset v110. Почему он не имеет поддержки Visual C++ Compiler November 2012 CTP - непонятно. Никак. Тупо преобразование enum-констант в строки для вывода на консоль. Статической переменной внутри функции на которую возвращается ссылка. Для инициализации единичной переменной - прокатит, но если нужно как-то так?
0
|
Комп_Оратор)
|
|
24.11.2020, 15:03 | 6 |
Статическая переменная внутри функции ни чем не хуже чем такая же но
Я добавил вариант, где присвоение происходит единожды. Хотите почленно, хотите, - еще как-то. Можно итераторы на статический массив в std::copy передать. Если зарезервировать размер сразу, то без бекинсёртинга будет быстрее. Но памяти больше (ещё и массив нужен). Не суть. Можно сделать как-то. И в последнем примере - уже 2D вектор или это у меня двоится? Добавлено через 9 минут А - понял - массив векторов... И это делается также. Сначала объявляете массив из 3 а потом присваиваете. В той же функции. Иначе придётся работать с указателями на векторы или с обёртками ссылок reference_wrapper<T>, так как С++ не поддерживает неконстантных ссылок.
0
|
1563 / 484 / 105
Регистрация: 17.05.2015
Сообщений: 1,472
|
|
24.11.2020, 15:17 | 7 |
Думаете, поддержка сама как то должна по волшебству появиться?
Попробуйте сначала пройти по ссылке, которую я оставила специально для вас. Скачать и установить компилятор.
0
|
Мозгоправ
|
|
24.11.2020, 16:07 [ТС] | 8 |
Вообще-то, я как-то рассчитывал, что в Visual Studio 2019 должны присутствовать все патчи для предыдущих версий. Наверное я слишком много хочу от Microsoft?
Ну да ладно, ok. По ссылке вашей я сходил. Всё вроде здорово, однако Так что качать не имеет смысла.
0
|
Неэпический
|
||||||
24.11.2020, 16:14 | 9 | |||||
Сообщение было отмечено L0M как решение
Решение
И, к слову, зачем вообще понадобился статический константный вектор? Почему не std::array , например?
2
|
Мозгоправ
|
|
24.11.2020, 16:39 [ТС] | 10 |
Да не, понятно, что делается. Выглядит только по-уродски. (Это не к вам, а к реализации C++11 в VS2012).
Я думал, может есть более элегантное решение для такой инициализации. Добавлено через 24 минуты Я показал пример кода, в котором возникает ошибка. А вообще, в контексте общей задачи, есть вектор, в который в процессе выполнения некоей операции добавляются значения из перечисления. А потом содержимое этого вектора сравнивается с известрой строкой из таблички (ага, тот самый константный массив векторов) возможных результатов. Ну и по совпадению определяется правильно ли выполнена операция. Поэтому табличку пришлось оформить тупо как массив массивов с инициализацией (привет, C). И написать функцию сравнения вектора с массивом. Мне показалось логичным сравнивать вектор с вектором. Но в 2012 не прокатило.
0
|
Неэпический
|
||||||
24.11.2020, 16:47 | 11 | |||||
0
|
Комп_Оратор)
|
||||||
24.11.2020, 17:01 | 12 | |||||
Но статический константный вектор иначе не может выглядеть. И это не к вектору. L0M, этот тип данных создан с диаметрально противоположными намерениями. И
В константный вектор не надо пробовать что-то добавить. Ему даже присвоить нельзя:
0
|
Комп_Оратор)
|
||||||
24.11.2020, 20:44 | 14 | |||||
Теперь понял. Да у него есть перегруженный == (а начиная с С++20 и ещё куча всего). Ну и создайте:
1
|
24.11.2020, 20:44 | |
24.11.2020, 20:44 | |
Помогаю со студенческими работами здесь
14
Инициализация (ООП, списки инициализации) Инициализация не агрегированных данных списка инициализации не допускается Инициализация в теле конструктора или в списке инициализации. Инициализация константного массива из элементов кортежа Конструктор со списком инициализации членов Инициализация полей объекта в заголовочном файле против списка инициализации Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |