4 / 4 / 0 Регистрация: 25.06.2010 Сообщений: 106 |
|
1 |
|
07.08.2011, 11:08. Показов 3805. Ответов 8
кто знает че за ошибка, как с ней бороться?
__________________
0 |
4864 / 3286 / 468 Регистрация: 10.12.2008 Сообщений: 10,570 |
|
07.08.2011, 11:14 |
2 |
в функции main() …
0 |
4 / 4 / 0 Регистрация: 25.06.2010 Сообщений: 106 |
|
07.08.2011, 11:35 [ТС] |
3 |
я подумал две разные ошибки )) 000615.cpp: In function ‘int main()’: Компилятор VS2008 без ошибок все выполняет, а GNU C++ вот эти ошибки и выдает
0 |
dihlofos Бродяга 314 / 268 / 56 Регистрация: 27.08.2010 Сообщений: 553 |
||||
07.08.2011, 11:41 |
4 |
|||
Noname2512, в ошибке всё и написано.
поставь пробел между угловыми скобками.
1 |
Заблокирован |
|
07.08.2011, 11:41 |
5 |
возможно, намек, что вместо vector<vector<int>> То есть, нужно между >> пробел оставить.
1 |
Делаю внезапно и красиво 1312 / 1227 / 72 Регистрация: 22.03.2011 Сообщений: 3,744 |
|
07.08.2011, 19:33 |
7 |
Странно, что 2008 компилирует. Это только в новом стандарте без пробела писать разрешено…
0 |
Делаю внезапно и красиво 1312 / 1227 / 72 Регистрация: 22.03.2011 Сообщений: 3,744 |
|
07.08.2011, 19:41 |
9 |
Круто, я думал только в 10 появилось. Всё равно уже рука не поднимается так писать.)
0 |
- Forum
- General C++ Programming
- Templates and vectors of pairs
Templates and vectors of pairs
I’ve just begun with templates, and I’m having issues with this:
|
|
My errors:
|
|
I really don’t understand what’s prompting the errors. If anybody could give me some help, I’d really appreciate it. (I’m compiling with gcc)
Thanks,
Jordy
I don’t think the errors could be any more explicit.
std::vector<std::pair<T, T>> is invalid. It’s
std::vector<std::pair<T, T> >
>> is an operator, remember?
std::vector<std::pair<T, T>> is invalid. It’s
std::vector<std::pair<T, T> >
>> is an operator, remember?
Oh, wow, that was amazingly simple.
I have a habit of only looking at the first error message, because the subsequent ones tend to be caused by the first message, and go away after the first one is fixed. So, I didn’t but 2 and 2 together and see the the function call it was talking about must have been the >> operator.
Thank you.
Topic archived. No new replies allowed.
Это компилирует:
std::map<int, std::vector<int> > vDescriptorAtom;
Это:
std::map<int, std::vector<int>> vDescriptorAtom;
выдает следующую ошибку:
src/MessageHandler.cpp:191: error: >> should be > > within a nested template argument list
Это очевидно, потому что >>
это оператор. Но, глядя на ошибку, которую выдает GCC, я не могу понять, что она пытается сказать. Что означает «список аргументов вложенного шаблона». Благодарю.
2
Решение
Материал между внешней парой скобок (1) — это список аргументов шаблона для std::map
шаблон
std::map<int, std::vector<int>>
// (1) ^ ^
// (2) ^ ^
Внутренняя пара (2) является списком аргументов шаблона для std::vector
шаблон и это вложенными внутри первого и вот что говорит ошибка.
До C ++ 11 пробел был обязательным между >>
в конце, чтобы облегчить парсеру жизнь (как вы заметили, вместо этого он будет интерпретироваться как оператор правого сдвига). В любом случае, многие компиляторы пытались правильно его проанализировать, чтобы получить значимое сообщение об ошибке, доказав, что это не невозможно. Я думаю, это одна из причин, по которой это ограничение было ослаблено в C ++ 11.
4
Другие решения
У вас есть вложенный аргумент шаблона:
std::map<int, std::vector<int>>
^-outer---------------^
^-inner--------^
Это разрешено в C ++, однако в C ++ до C ++ 11, >>
был автоматически разбит на токены оператору right-shift, что делает использование, как в вашем некомпилируемом примере, недопустимым, потому что то, что компилятор видит после токенизации
[std] [::] [map] [<] [int] [,] [std] [::] [vector] [<] [int] [>>]
open 1 open 2 .... close?
т.е. он не нашел бы соответствующего закрытия >
,
Это то, что пытается описать сообщение об ошибке, включая предлагаемое исправление. Под этим предложением компилятор подразумевает, что он действительно может угадать, что вы имеете в виду, но по стандарту C ++ 2003 ему не разрешают угадывать и не разрешают такое использование.
В текущем C ++ (C ++ 11 и новее) ваше второе использование разрешено.
4
У вас включен педантичный режим? Он говорит вам «ты хотел написать это». Хотя более новые версии GCC (4.6 …?) И C ++ 11 исправляют это.
Он знает, что вы явно хотели написать > >
, но он не будет соответствовать стандарту, если это позволит. Код должен быть переносимым, то есть любой компилятор C ++ должен работать.
У вас есть шаблон внутри шаблона, следовательно, вложенный. Это нормально, это как List<List<Something<int> > >
, список списков чего-то типа int.
Вот что означают вложенные шаблоны.
3
3 ответа
Материал между внешней парой скобок (1) является списком аргументов шаблона для шаблона std::map
std::map<int, std::vector<int>>
// (1) ^ ^
// (2) ^ ^
Внутренняя пара (2) является списком аргументов шаблона для шаблона std::vector
и она вложена внутри первой и что говорит об ошибке.
До С++ 11 пробелы были обязательными между >>
в конце, чтобы облегчить жизнь для синтаксического анализатора (как вы заметили, вместо этого он будет интерпретироваться как оператор сдвига справа). Многие компиляторы прилагали все усилия, чтобы разобрать его правильно, чтобы дать значимое сообщение об ошибке, доказывая, что это невозможно. Я предполагаю, что одна из причин этого ограничения была смягчена на С++ 11.
jrok
23 окт. 2013, в 10:32
Поделиться
У вас есть вложенный аргумент шаблона:
std::map<int, std::vector<int>>
^-outer---------------^
^-inner--------^
Это разрешено в C++, однако в C++ до C++ 11, >>
был автоматически обозначен для оператора с правой сменой, что приводит к использованию, как в вашем некомпилирующем примере, недопустимым, поскольку то, что видит компилятор после токенизация
[std] [::] [map] [<] [int] [,] [std] [::] [vector] [<] [int] [>>]
open 1 open 2 .... close?
т.е. не найдет соответствующее закрытие >
.
Это то, что пытается описать сообщение об ошибке, включая предлагаемое исправление. Под капотом это предложение компилятора означает, что оно действительно может угадать, что вы имеете в виду, но по стандарту C++ 2003 не разрешено угадывать и не разрешать это использование.
В текущем C++ (C++ 11 и новее) ваше второе использование разрешено.
Sebastian Mach
23 окт. 2013, в 11:01
Поделиться
У вас есть педантичный режим? Это говорит вам: «Вы хотели написать это». Хотя новые версии GCC (4.6…?) И C++ 11 исправляют это.
Он знает, что вы, очевидно, хотели писать > >
, но он не соответствовал бы стандарту, если бы это разрешило. Код должен быть переносимым, то есть любой компилятор C++ должен работать.
У вас есть шаблон внутри шаблона, поэтому он вложен. Это прекрасно, это похоже на List<List<Something<int> > >
, список списков somethings int.
Это то, что означает вложенные шаблоны.
Alec Teal
23 окт. 2013, в 10:40
Поделиться
Ещё вопросы
- 0Как найти элементы с одинаковыми атрибутами data- * и удалить дубликаты?
- 1Как сделать запрос ContactsContract.CommonDataKinds.Phone на Android?
- 0Вызов функции объекта в лямбде for_each?
- 0Как сохранить дату в миллисекундах Unix в Mysql?
- 0Вызов функции при щелчке на включенном элементе внутри директивы AngularJS
- 0Outlook 2007/2010/2013 Проблема с отображением электронной почты
- 0Ошибка коннектора MySQL / C ++ «Неразрешенный внешний символ _get_driver_instance» в Visual Studio 2017
- 1Как проверить вызванные обещания, не возвращенные в проверенной функции
- 1Как я могу использовать Gulp, чтобы показать тестовое покрытие, используя gulp-mocha
- 0Angular JS — передача области видимости
- 1Как выбрать разрешение изображения для отображения в полноэкранном режиме?
- 0Подкладка колонн вверх
- 1Извлечь тип объекта из строки формата
- 1Маршаллинг родной функции
- 1Python ctypes.sizeof (…) всегда возвращает 0
- 1заполнение списка объектов в linq to sql
- 1Как рассчитать дни с момента записи? Android, SQLite, Java
- 1Случайное расписание Alarm Manager с календарем
- 1Модель гауссовой смеси — Сингулярная матрица
- 0Сделать пользовательский интерфейс недоступным для редактирования, когда мы переходим с одной страницы на другую
- 0Hexdump структуры не выводит правильную информацию
- 0Как добавить расширяемый блок дополнительной информации в строку таблицы, созданную в выражении Angular repeat?
- 0Базовый шаблон Yii2 — Как войти из базы данных mysql
- 0HTML: сделать все 3 столбца равными по высоте (автоматическое изменение размера)
- 1Сокращение времени расчета и требований к большой ковариационной матрице
- 1C # IDbConnection FbConnection не удалось. Индекс вне диапазона
- 0Как использовать jQuery для выбора этого элемента: <span style = «vertical-align: bottom»>
- 0SQL ГДЕ В СОЕДИНЕНИИ
- 0Рисование линейного графика, нажатие кнопки при помощи Javascript / JQuery
- 0Указание нескольких селекторов при изменении классов в jquery
- 0Вставьте нижний колонтитул в нижней части веб-страницы
- 1API клиента Android и Google Класс NetHttptransport не найден
- 1c # MailKit, как удалить письмо с почтового сервера (IMAP)
- 0время сортировки php всегда дает текущие данные без форматирования заданной даты
- 0Исчезновение изображения в JavaScript не работает
- 0Почему деструктор не вызывается для массива объектов?
- 0Тест контроллера всегда дает неопределенную область видимости
- 1Заменить нули в столбце на строку из строки выше (Python / Pandas)
- 1Не удалось загрузить myapp.apk
- 1Преобразование XML-документа в IEnumerable
- 1ретранслятор asp.net для каждой строки
- 1Установить MongoDB на тот же экземпляр AWS EC2, что и мое существующее приложение NodeJS?
- 0Как получить дату начала и окончания каждой недели в текущем месяце, используя mysql?
- 0Как исключить файлы из модульного теста
- 1В Spark RDD являются неизменяемыми, тогда как реализованы аккумуляторы?
- 1Что не так с моим решением о Sqrt (x)
- 0Как использовать тип данных времени только в Rails?
- 1Как сделать анимацию последовательных данных с помощью d3.js?
- 0Как использовать ng-show, когда в массиве существует ключ с определенным значением?
- 0JQuery — выбор одного значения из выпадающего списка, публикация другого