Различия в поведении инициализатора_листов контейнера g ++ STL между 4.4 и 4.7

Следующая функция c ++ 0x / c ++ 11 (списки инициализаторов, в том числе для контейнеров STL) должна позволить мне инициализировать этот STL std::map при декларации. И, это прекрасно работает в g ​​++ 4.7.2, но я получаю ошибку, пытаясь скомпилировать его в g ++ 4.4.6. Согласно документации GCC, эта функция c ++ 0x была доступна в 4.4, но, очевидно, либо (а) я что-то делаю не так, либо (б) она была неполной в g ++ 4.4.

std::map<std::string,std::vector<std::string>>
DbConnection::attrs_of_type = {
{ "http",           { "url", "ipaddress", "port",
"username", "password" } },
{ "email",          { "address", "full_name" } },
{ "ftp",            { "hostname", "ipaddress", "port",
"username", "password", "filename" } }
};

Но, когда я пытаюсь скомпилировать под gcc 4.4.6, я получаю следующее no matching function call ошибка, в типичном «почти невозможно понять» способ:

database.cc:164: error: no matching function for call to ‘std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::map(<brace-enclosed initializer list>)’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:195: note: candidates are: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::initializer_list<std::pair<const _Key, _Tp> >, const _Compare&, const _Alloc&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:181: note:                 std::map<_Key, _Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:170: note:                 std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:150: note:                 std::map<_Key, _Tp, _Compare, _Alloc>::map() [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >]

(возможно ли изменить формат этой вставки, чтобы она не требовала такой большой горизонтальной прокрутки?)

Тем не мение. На данный момент я пытаюсь понять, что мне нужно сделать по-другому, чтобы эта инициализация работала в g ++ 4.4.6. Могу ли я что-то изменить в том, как я объявляю std::map, или std::vector, что решит проблему? Или должен использоваться совершенно другой подход из-за другой и / или неполной реализации этой функции c ++ 11 в g ++ 4.4?

2

Решение

Ваш код правильный. g ++ — 4.4 официально поддерживает списки инициализаторов. Но я вспоминаю (я слежу за статьями wg21), что была обеспокоенность, особенно в связи с невозможностью инициализировать контейнеры так, как вы делаете (с вложением) в комитете в какой-то момент.

Вполне вероятно, что g ++ — 4.4 не имеет полной поддержки std::initializer_list синтаксис из-за этих изменений, которые были сделаны позже во времени.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]