Error should be within a nested template argument list

Error: '>>' should be '>>' within a nested template argument list C++ Решение и ответ на вопрос 339769

4 / 4 / 0

Регистрация: 25.06.2010

Сообщений: 106

1

07.08.2011, 11:08. Показов 3805. Ответов 8


кто знает че за ошибка, как с ней бороться?
000615.cpp: In function ‘int main()’:

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



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()’:
000615.cpp:43: error: ‘>>’ should be ‘> >’ within a nested template argument list
в 43 строке написано : vector<vector<int>> matrix(g,vector<int>(w);
g,w — const int;

Компилятор VS2008 без ошибок все выполняет, а GNU C++ вот эти ошибки и выдает



0



dihlofos

Бродяга

314 / 268 / 56

Регистрация: 27.08.2010

Сообщений: 553

07.08.2011, 11:41

4

Noname2512, в ошибке всё и написано.

C++
1
vector<vector<int> >

поставь пробел между угловыми скобками.



1



Bers

Заблокирован

07.08.2011, 11:41

5

возможно, намек, что вместо vector<vector<int>>
нужно записать 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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifndef VECTOR2_HPP
#define VECTOR2_HPP
#include <cmath>
#include <utility>
#include <vector>

#ifndef M_PI
#define M_PI 3.1415926
#endif

#define DEGTORAD(Deg) ((Deg * M_PI) / 180.0)
#define RADTODEG(Rad) ((180.0 * Rad) / M_PI)

/*
 * Euclidian vector with many useful member functions
 */
template <class T>
class Vector2
{
	public:
		Vector2()
		{
			magnitude = 0;
			direction = 0;
		}
		Vector2(T start_magnitude, T start_direction)
		{
			magnitude = start_magnitude;
			direction = start_direction;
		}
		~Vector2()
		{
		}

		T magnitude;
		T direction;

		/*
		 * Returns an std::pair<T, T> of the coordinates of the
		 * point_numth point on the vector
		 */
		std::pair<T, T> get_point(int point_num)
		{
			std::pair<T, T> point;
			point.first = std::sin(DEGTORAD(direction)) * magnitude;
			point.second =
				std::cos(DEGTORAD(direction)) * magnitude;
			return point;
		}

		/*
		 * Returns an std::vector<std::pair<T, T>>. Each pair contains
		 * the coordinates of a point on the vector, up to num_points
		 * points (including (0, 0))
		 */
		std::vector<std::pair<T, T>> get_points(int num_points)
		{
			std::vector<std::pair<T, T>> points;
			for (int i = 0; i < num_points; i++)
			{
				std::pair<T, T> point = get_point(i);
				points.push_back(point);
			}
			return points;
		}
};

#endif // VECTOR2_HPP 

My errors:

1
2
3
4
5
6
7
8
9
Vector2.hpp:56: error: a function call cannot appear in a constant-expression
Vector2.hpp:56: error: ‘>>’ should be ‘> >’ within a nested template argument list
Vector2.hpp: In member function ‘std::vector<std::pair<_ForwardIterator, _ForwardIterator>, std::allocator<std::pair<_ForwardIterator, _ForwardIterator> > > Vector2<T>::get_points(int)’:
Vector2.hpp:58: error: ‘coords’ was not declared in this scope
Vector2.hpp:58: error: ‘>>’ should be ‘> >’ within a nested template argument list
Vector2.hpp:58: error: redeclaration of ‘std::vector<std::pair<_ForwardIterator, _ForwardIterator>, std::allocator<std::pair<_ForwardIterator, _ForwardIterator> > > coords’
Vector2.hpp:58: error: ‘<typeprefixerror>coords’ previously declared here
main.cpp: In function ‘int main()’:
main.cpp:8: error: ‘>>’ should be ‘> >’ within a nested template argument list

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?

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?

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 — выбор одного значения из выпадающего списка, публикация другого

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Error shift chara
  • Error timeout postman
  • Error ts2304 cannot find name
  • Error timeout origin
  • Error ts 2322

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии