C ++ 11 на основе диапазона для вектора указателей - PullRequest
6 голосов
/ 18 апреля 2011

Я только что скомпилировал GCC 4.6.0, и я хотел опробовать новые возможности, начиная с цикла for, основанного на диапазоне.
Первый цикл, который я хотел изменить, был итерацией по std :: vector ofуказатели.Я изменил код, чтобы использовать новый синтаксис, но он не компилировался.

Я попытался заменить другой цикл, который был на std :: vector структур, и он скомпилировался и прекрасно работал.

Вот короткий тестовый код, чтобы показать вам мою проблему:

#include <vector>
#include <iostream>

int main()
{
    std::vector< int > values;

    values.push_back(2);
    values.push_back(5);
    values.push_back(8);
    values.push_back(13);
    values.push_back(17);

    for (int &n : values)
    {
        std::cout << n << "\n";
    }

    std::vector< int* > pointers;

    pointers.push_back(new int(2));
    pointers.push_back(new int(5));
    pointers.push_back(new int(8));
    pointers.push_back(new int(13));
    pointers.push_back(new int(17));

    for ((int*) &p : values)
    {
        std::cout << (*p) << "\n";
    }

    for( unsigned int i = 0; i < pointers.size(); ++i)
    {
        delete pointers[i];
    }

    return 0;
}

Когда я пытаюсь скомпилировать (да, я даю -std = c ++ 0x какпараметр g ++) , он умирает с этой ошибкой:
main.cpp|27|error: found ‘:’ in nested-name-specifier, expected ‘::’
Если я закомментирую строки 27-30, это нормально.

Что я делаю не так?Разве указатель-ссылка не объявляет синтаксис правильным?
Или есть ограничение для содержащихся типов, в которых могут использоваться циклы, основанные на диапазонах?

Спасибо за любую помощь!

Ответы [ 2 ]

14 голосов
/ 18 апреля 2011
for ((int*) &p : values)

Это неправильно. (int*) - это одно только выражение, поэтому вам нужно сделать int*& (без круглых скобок, которое делает выражение - иначе как "имя типа") хотя бы для того, чтобы сделать его правильным. Я предпочитаю использовать авто или авто &, лично.

Вы можете сделать:

for (auto p : values) // here p is a pointer, a copy of each pointer

или

for (auto& p : values ) // here p is a non-const reference to a pointer

или

for ( int* p : values ) // here p is a copy of each pointer

или в общем коде:

for ( auto&& p: values ) // p is either a const reference to what is in values, or a non-const reference, depends on the context
1 голос
/ 18 апреля 2011

Я думаю, что вы хотели перебирать «указатели» вместо «значений» там ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...