Инициализатор списка - PullRequest
       1

Инициализатор списка

2 голосов
/ 27 сентября 2010

Я пытаюсь объявить итератор типа std::initializer_list, как описано в в этом ответе .

Но я всегда получаю эту ошибку:

error: 'iterator' is not a member of 'std::initializer_list<int>'

Как мне объявить итератор типа std::initializer_list?

Следующий код, например, не будет работать. Кроме того, используемый мной компилятор поддерживает черновик нового стандарта.

int findCommon(std::initializer_list<int> nums)
{
    std::initializer_list<int>::iterator it;
    for (it = nums.begin() ; it != nums.end() ; ++it)
    {
        std::cout << *it << std::endl;
    }
    return 1;
}

Ответы [ 3 ]

3 голосов
/ 27 сентября 2010

Вам нужно добавить

#include <initializer_list>

, и для этого примера, вероятно, также

#include <iostream>

Также убедитесь, что вы используете переключатель -std=c++0x для g ++.И вам нужен как минимум g ++ версии 4.4. При использовании компилятора из MacPorts, компилятор называется g++-mp-4.5 или g++-mp-4.4. (неверное предположение).

Я заметил некоторые недавно исправленные ошибки, связанные с initializer_list на GCC bugzilla , поэтому я рекомендую получить новейшую версию GCC, 4.5.1.Потому что при использовании этой версии я могу без проблем скомпилировать оба ваших примера.

1 голос
/ 27 сентября 2010

Реализация вашего компилятора, вероятно, просто не имеет этих typedef (например, в GCC 4.4.1, initializer_list не содержит никаких typedef, вы можете проверить заголовок самостоятельно).

В качестве «обходного пути» используйте auto:

int findCommon(std::initializer_list<int> nums)
{
    for (auto it = nums.begin() ; it != nums.end() ; ++it)
    {
        std::cout << *it << std::endl;
    }
    return 1;
}

Или полагаться на initializer_list<T>::iterator как синоним const T*.

0 голосов
/ 28 сентября 2010

Вы можете избежать непосредственного указания типа итератора, что должно привести к чистому коду:

void f(std::initializer_list<int> nums)
{
  for (auto x : nums) {
    std::cout << x << '\n';
  }
  // or:
  std::copy(begin(nums), end(nums), std::ostream_iterator(std::cout, "\n"));
}

Основанные на диапазоне значения для циклов поддерживаются в GCC 4.6 . (Любая проблема, называя их циклами foreach, неофициально?)

Включая может потребоваться для std :: begin и std :: end, хотя несколько заголовков гарантируют, что они объявлены (24.6.5, N3092).

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