列出初始化程序

时间:2010-09-27 12:34:31

标签: c++ c++11

我正在尝试声明类型std::initializer_list的迭代器,如this answer中所述。

但我总是得到这个错误:

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 个答案:

答案 0 :(得分:3)

您需要添加

#include <initializer_list>

并且对于这个例子可能也是

#include <iostream>

还要确保使用-std=c++0x切换到g ++。而且你至少需要g ++ 4.4版。 在MacPorts中使用编译器时,编译器称为g++-mp-4.5g++-mp-4.4(假设不正确)。

我注意到GCC bugzilla上与initializer_list相关的一些最近修复的错误,因此我建议您获取GCC的最新版本4.5.1。因为在使用这个版本时,我能够毫无问题地编译你的例子。

答案 1 :(得分:1)

您的编译器实现可能只是没有这些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*的同义词。

答案 2 :(得分:0)

您可以避免直接指定迭代器类型,这样可以使代码更清晰:

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"));
}

基于范围的for循环是supported in GCC 4.6。 (任何问题都称他们为foreach循环,非正式?)

包括&lt; iterator&gt; std :: begin和std :: end可能需要它们,尽管有几个头文件保证它们被声明(24.6.5,N3092)。