[英]List initializer
我试图声明一个类型为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;
}
您需要添加
#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。 因为使用此版本时,我可以毫无问题地编译两个示例。
您的编译器的实现可能只是没有这些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*
的同义词。
您可以避免直接指定迭代器类型,这会导致代码更简洁:
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支持基于范围的for循环。 (是否有非正式地将它们称为foreach循环的问题?)
std :: begin和std :: end可能需要包含<iterator>,尽管可以保证声明了多个标头(24.6.5,N3092)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.