2015-05-13 2 views
4

Я пытаюсь итератора больше list указателей:Использование итераторы на список указателей

int main() { 
    list<Game*> Games; 
    Games = build_list_from_file(); //Reading the games.info file 
    list<Game*>::iterator it = Games.begin(); 
    it++; 
    cout << *it->get_name() << endl ; 
    // ... 
} 

Когда я скомпилировать его, у меня есть эта ошибка:

error: request for member ‘get_name’ in ‘* it.std::_List_iterator<_Tp>::operator-><Game*>()’, which is of pointer type ‘Game*’ (maybe you meant to use ‘->’ ?) 
    cout << *it->get_name() << endl ; 
      ^

Game является классом, имеет функцию get_name, которая возвращает название игры. Что делать, чтобы сделать эту компиляцию?

+1

При работе с итераторами рекомендуется использовать 'auto'. – prompt

+0

Мой вопрос был хорошим, потому что я думаю, что моя ошибка распространена, спасибо всем! –

+0

Кстати, в вашем коде нет 'vector' – user463035818

ответ

6

Вы должны написать (*it)->get_name(), поскольку operator-> имеет более высокий приоритет, чем оператор разыменования.

7

Вы запустить в operator precedence вопрос. -> имеет более высокий приоритет, чем *, так что вы действительно делаете:

*(it->get_name()) 

, который не компилируется, так как Game* не имеет членов, гораздо меньше get_name. Сначала вам необходимо выполнить разыменование, которое должно быть заключено в скобки:

2

Все дело в приоритете оператора.

Это должно быть (*it)->get_name()

Если вы можете использовать C++ 11, а затем использовать автомобиль для лучшей читаемости.

int main(){ 
    list<Game*> Games; 
    Games = build_list_from_file(); //Reading the games.info file 
    auto it = Games.begin(); 
    it++; 
    cout << (*it)->get_name() << endl ; 
// ... 
} 
+1

авто - отличная вещь, спасибо. –

Смежные вопросы