我正在尝试声明类型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;
}
答案 0 :(得分:3)
您需要添加
#include <initializer_list>
并且对于这个例子可能也是
#include <iostream>
还要确保使用-std=c++0x
切换到g ++。而且你至少需要g ++ 4.4版。 在MacPorts中使用编译器时,编译器称为(假设不正确)。g++-mp-4.5
或g++-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)。