std :: for_each使用g ++编译错误,而不是VS2012

时间:2012-10-16 06:52:16

标签: c++ visual-c++ c++11 g++

我有以下代码(尽可能简化):

#include <vector>
#include <algorithm>

using std::vector;

enum class Foo {
    BAR, BAZ
};

void print_to_file(const vector<const vector<Foo> >& sequences) {
    std::for_each(sequences.begin(), sequences.end(), [](const vector<Foo>& sequence) {
    });
}

int main(int argc, char **argv) {
    return EXIT_SUCCESS;
}

使用g++ (SUSE Linux) 4.7.1 20120723 [gcc-4_7-branch revision 189773]作为g++ --std=c++11 test.cpp进行编译时收到以下错误消息:

In file included from /usr/include/c++/4.7/x86_64-suse-linux/bits/c++allocator.h:34:0,
                 from /usr/include/c++/4.7/bits/allocator.h:48,
                 from /usr/include/c++/4.7/vector:62,
                 from test.cpp:1:
/usr/include/c++/4.7/ext/new_allocator.h: In instantiation of ‘struct __gnu_cxx::new_allocator<const std::vector<Foo> >’:
/usr/include/c++/4.7/bits/allocator.h:89:11:   required from ‘class std::allocator<const std::vector<Foo> >’
/usr/include/c++/4.7/bits/alloc_traits.h:89:43:   required from ‘struct std::allocator_traits<std::allocator<const std::vector<Foo> > >’
/usr/include/c++/4.7/ext/alloc_traits.h:109:10:   required from ‘struct __gnu_cxx::__alloc_traits<std::allocator<const std::vector<Foo> > >’
/usr/include/c++/4.7/bits/stl_vector.h:76:28:   required from ‘struct std::_Vector_base<const std::vector<Foo>, std::allocator<const std::vector<Foo> > >’
/usr/include/c++/4.7/bits/stl_vector.h:208:11:   required from ‘class std::vector<const std::vector<Foo> >’
test.cpp:11:25:   required from here
/usr/include/c++/4.7/ext/new_allocator.h:83:7: error: ‘const _Tp* __gnu_cxx::new_allocator<_Tp>::address(__gnu_cxx::new_allocator<_Tp>::const_reference) const [with _Tp = const std::vector<Foo>; __gnu_cxx::new_allocator<_Tp>::const_pointer = const std::vector<Foo>*; __gnu_cxx::new_allocator<_Tp>::const_reference = const std::vector<Foo>&]’ cannot be overloaded
/usr/include/c++/4.7/ext/new_allocator.h:79:7: error: with ‘_Tp* __gnu_cxx::new_allocator<_Tp>::address(__gnu_cxx::new_allocator<_Tp>::reference) const [with _Tp = const std::vector<Foo>; __gnu_cxx::new_allocator<_Tp>::pointer = const std::vector<Foo>*; __gnu_cxx::new_allocator<_Tp>::reference = const std::vector<Foo>&]’

相同的代码可以很好地编译VS2012,但在g ++下失败并且我没有丝毫想知道如何解释错误信息。

2 个答案:

答案 0 :(得分:5)

我很惊讶你在其他地方没有遇到问题,因为vector<const vector<Foo> >不是一种可能的数据类型。

std::vector的value_type必须至少是可复制的(C ++ 03)或可移动的(C ++ 11)。如果是const,则无法分配或移动它。

答案 1 :(得分:3)

用于标准容器的分配器要求不允许容器保存const个对象。 C ++ 11 17.6.3.5“分配器要求”概述了使用从表27开始的一组表的标准分配器的要求。在表27中,第一个定义是针对“描述性变量”T,{{ 1}}和U定义为“任何非const ,非参考对象类型”。用于Allocator类定义的描述性变量CX是:

  

Y - 类型X

的分配器类      

T - 类型Y

的相应Allocator类

总之,标准分配器是根据非常数类型的参数化定义的。

有一个旧的GCC / libstdc ++错误(解决为无效)可以追溯到2004年(C ++ 2003对于在容器中存储const对象有类似的限制,但它更简单,因为2003标准更直接地说存储在容器中的对象类型必须是“可分配的”。)