From: Mikael on
Hi Everybody!

I just tried to compile the following with gcc-4.5 in c++0x mode:

int main (int argc, char* argv[])
{
std::map<std::string, std::vector<std::string>> m {
{"Hello", {"Good", "World"}},
{"Goodbye", {"Rude", "World"}}
};
return 0;
}

However I get compilation errors when I do that (the errors are at the
bottom of this mail), if I however explicitly call the
std::vector<std::string>() constructor like this:

int main (int argc, char* argv[])
{
std::map<std::string, std::vector<std::string>> m {
{"Hello", std::vector<std::string>({"Good", "World"})},
{"Goodbye", std::vector<std::string>({"Rude", "World"})}
};
return 0;
}

It however works correctly. I just wanted to know if this is supposed
to work before I file a bug on gcc.


With kind regards,

Mikael Olenfalk


PS: For your reference, here are the errors:

map.cpp: In function 'int main(int, char**)':
map.cpp:12:3: error: no matching function for call to
'std::map<std::basic_string<char>, std::vector<std::basic_string<char>
> >::map(<brace-enclosed initializer list>)'
/usr/lib/gcc-snapshot/lib/gcc/i486-linux-gnu/4.5.0/../../../../include/
c++/4.5.0/bits/stl_map.h:195:7: note: candidates are: std::map<_Key,
_Tp, _Compare, _Alloc>::map(std::initializer_list<std::pair<const
_Key, _Tp> >, const _Compare&, const allocator_type&) [with _Key =
std::basic_string<char>, _Tp = std::vector<std::basic_string<char> >,
_Compare = std::less<std::basic_string<char> >, _Alloc =
std::allocator<std::pair<const std::basic_string<char>,
std::vector<std::basic_string<char> > > >, allocator_type =
std::allocator<std::pair<const std::basic_string<char>,
std::vector<std::basic_string<char> > > >]
/usr/lib/gcc-snapshot/lib/gcc/i486-linux-gnu/4.5.0/../../../../include/
c++/4.5.0/bits/stl_map.h:181:7: note: std::map<_Key,
_Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&)
[with _Key = std::basic_string<char>, _Tp =
std::vector<std::basic_string<char> >, _Compare =
std::less<std::basic_string<char> >, _Alloc =
std::allocator<std::pair<const std::basic_string<char>,
std::vector<std::basic_string<char> > > >, std::map<_Key, _Tp,
_Compare, _Alloc> = std::map<std::basic_string<char>,
std::vector<std::basic_string<char> > >]
/usr/lib/gcc-snapshot/lib/gcc/i486-linux-gnu/4.5.0/../../../../include/
c++/4.5.0/bits/stl_map.h:170:7: note: std::map<_Key,
_Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare,
_Alloc>&) [with _Key = std::basic_string<char>, _Tp =
std::vector<std::basic_string<char> >, _Compare =
std::less<std::basic_string<char> >, _Alloc =
std::allocator<std::pair<const std::basic_string<char>,
std::vector<std::basic_string<char> > > >, std::map<_Key, _Tp,
_Compare, _Alloc> = std::map<std::basic_string<char>,
std::vector<std::basic_string<char> > >]
/usr/lib/gcc-snapshot/lib/gcc/i486-linux-gnu/4.5.0/../../../../include/
c++/4.5.0/bits/stl_map.h:159:7: note: std::map<_Key,
_Tp, _Compare, _Alloc>::map(const _Compare&, const allocator_type&)
[with _Key = std::basic_string<char>, _Tp =
std::vector<std::basic_string<char> >, _Compare =
std::less<std::basic_string<char> >, _Alloc =
std::allocator<std::pair<const std::basic_string<char>,
std::vector<std::basic_string<char> > > >, allocator_type =
std::allocator<std::pair<const std::basic_string<char>,
std::vector<std::basic_string<char> > > >]
/usr/lib/gcc-snapshot/lib/gcc/i486-linux-gnu/4.5.0/../../../../include/
c++/4.5.0/bits/stl_map.h:150:7: note: std::map<_Key,
_Tp, _Compare, _Alloc>::map() [with _Key = std::basic_string<char>,
_Tp = std::vector<std::basic_string<char> >, _Compare =
std::less<std::basic_string<char> >, _Alloc =
std::allocator<std::pair<const std::basic_string<char>,
std::vector<std::basic_string<char> > > >]


--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

From: Daniel Krügler on
On 9 Jun., 07:18, Mikael <mikael.olenf...(a)gmail.com> wrote:
> I just tried to compile the following with gcc-4.5 in c++0x mode:
>
> int main (int argc, char* argv[])
> {
> std::map<std::string, std::vector<std::string>> m {
> {"Hello", {"Good", "World"}},
> {"Goodbye", {"Rude", "World"}}
> };
> return 0;
> }
>
> However I get compilation errors when I do that

[..]

This must be a compiler error, the code should be well-formed
in C++0x. The defect becomes clearer, if you simplify your
example to

--------------------------
#include <vector>
#include <string>

template<typename T>
struct C {
C(std::initializer_list<T>){} // line 6
};

int main() {
std::vector<std::string> v{"Good", "World"};
C<std::vector<std::string>> c{{"Good", "World"}, {"Evil",
"Heaven"}}; // line 11
}
--------------------------

were you get a similar error:

c++ -std=c++0x -Wall main.cpp -o main
main.cpp: In function 'int main()':
main.cpp:11:69: error: no matching function for call to
'C<std::vector<std::basi
c_string<char> > >::C(<brace-enclosed initializer list>)'
main.cpp:6:3: note: candidates are:
C<T>::C(std::initializer_list<_Tp>) [with T
= std::vector<std::basic_string<char> >]
main.cpp:5:10: note:
C<std::vector<std::basic_string<char> > >::
C(const C<std::vector<std::basic_string<char> > >&)

A pre-version of 4.5.1 compiles my example
successfully.

HTH & Gretings from Bremen,

Daniel Kr�gler


--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

 | 
Pages: 1
Prev: Critique of code quality
Next: C++ FAQ