Prev: Critique of code quality
Next: C++ FAQ
From: Mikael on 8 Jun 2010 14:18 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 9 Jun 2010 04:05 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 |