2009-10-15 7 views
5

Еще раз я нахожусь в стороне от синтаксиса C++.C++: повторение списка общего типа

Я пытаюсь перебрать список общих объектов. То есть у меня есть объекты класса Event<Q>, переполненные в std::list<Event<Q> >.

Так что я пытаюсь получить итератор списка и интуитивно думали, что

std::list<Event<Q> >::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 

должны решить эту проблему. Тем не менее, я продолжаю получать эти ошибки:

..\calendar.h:48: error: expected `;' before "it" 
..\calendar.h:49: error: `it' was not declared in this scope 

Есть ли причина, по которой это сложно?

+1

Можете ли вы уточнить ошибки, которые вы получаете? –

+0

... и немного больше кода, может быть. Как создаются «события»? – peterchen

ответ

8

Уверенный, что это должно сработать, но похоже, что у вас есть одно или оба из следующих действий.

  • Имейте Q параметр шаблона или тип, который каким-то образом зависит от него (typedef to it). Поместите typename до std::list, чтобы компилятор знал, что ::iterator является типом и может провести анализ правильно (это может быть элемент статического значения). Зная, что это тип, компилятор может улучшить диагностику для определения шаблонов, и вам необходимо указать, является ли он типом с использованием typename.
  • events a const list. Затем используйте const_iterator.

Update: Показанная ошибка компиляции, безусловно, указывает на то, что первая точка верно: Q прямо или косвенно зависит от параметра шаблона, и вы должны положить typename так:

typename std::list< Event<Q> >::iterator it; 

компилятор считает, что это не-тип, и поэтому он требует некоторого оператора или точки с запятой позади ::iterator (например, умножения). Поместите typename, чтобы он знал, что вместо него набирает тип.

Обновление: См. Template FAQ по темам и решениям для аналогичных шаблонов.

+0

Большое спасибо, что решили.Я сделал: 'имяТипа станд :: Список > :: итератор Оно деталь A.' и волшебно работал – Nubsis

+0

Oops я пропустил событие <> часть вокруг Q XD Рад это работает :) –

+0

Ваше объяснение было очень ясным, а также решена моя проблема :) Большое спасибо, Йоханнес! –

0

в вашем образце, что такое S?

list<Event<S> >::iterator it; // what is S 
for (it = events.begin(); it != events.end(); it++) { ... } 

Вы можете попробовать разместить там родной тип?

list<Event<int> >::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 

или упростить его еще больше?

list<int>::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 
0

Вы импортировали пространство имен std? Если декларация итератора была:

std::list<Event<S> >::iterator it; 
Смежные вопросы