billyquith / ponder

C++ reflection library with Lua binding, and JSON and XML serialisation.
http://billyquith.github.io/ponder/
Other
642 stars 95 forks source link

Compile failed Ubuntu 14.04 - vector.erase #7

Closed davidthings closed 8 years ago

davidthings commented 8 years ago

This library looks really great. Eager to try it.

To wit, I just did a git clone / cmake / make and I got the following (rather inscrutable) compiler error

 make
[  4%] Building CXX object CMakeFiles/ponder.dir/src/args.cpp.o
[  8%] Building CXX object CMakeFiles/ponder.dir/src/arrayproperty.cpp.o
[ 12%] Building CXX object CMakeFiles/ponder.dir/src/class.cpp.o
[ 16%] Building CXX object CMakeFiles/ponder.dir/src/classcast.cpp.o
[ 20%] Building CXX object CMakeFiles/ponder.dir/src/classmanager.cpp.o
[ 24%] Building CXX object CMakeFiles/ponder.dir/src/classvisitor.cpp.o
[ 28%] Building CXX object CMakeFiles/ponder.dir/src/enum.cpp.o
[ 32%] Building CXX object CMakeFiles/ponder.dir/src/enumbuilder.cpp.o
In file included from /home/david/ponder/include/ponder/enum.hpp:41:0,
                 from /home/david/ponder/src/enumbuilder.cpp:32:
/home/david/ponder/include/ponder/detail/dictionary.hpp: In instantiation of ‘void ponder::detail::Dictionary<KEY, VALUE, CMP>::erase(const KEY&) [with KEY = std::basic_string<char>; VALUE = long int; CMP = ponder::Enum::EnumCmp]’:
/home/david/ponder/include/ponder/detail/dictionary.hpp:110:18:   required from ‘void ponder::detail::Dictionary<KEY, VALUE, CMP>::insert(const KEY&, const VALUE&) [with KEY = std::basic_string<char>; VALUE = long int; CMP = ponder::Enum::EnumCmp]’
/home/david/ponder/src/enumbuilder.cpp:48:41:   required from here
/home/david/ponder/include/ponder/detail/dictionary.hpp:123:13: error: no matching function for call to ‘std::vector<std::pair<std::basic_string<char>, long int>, std::allocator<std::pair<std::basic_string<char>, long int> > >::erase(__gnu_cxx::__normal_iterator<const std::pair<std::basic_string<char>, long int>*, std::vector<std::pair<std::basic_string<char>, long int>, std::allocator<std::pair<std::basic_string<char>, long int> > > >&)’
             m_contents.erase(it);
             ^
/home/david/ponder/include/ponder/detail/dictionary.hpp:123:13: note: candidates are:
In file included from /usr/include/c++/4.8/vector:69:0,
                 from /usr/include/c++/4.8/bits/random.h:34,
                 from /usr/include/c++/4.8/random:50,
                 from /usr/include/c++/4.8/bits/stl_algo.h:65,
                 from /usr/include/c++/4.8/algorithm:62,
                 from /home/david/ponder/include/ponder/format.h:39,
                 from /home/david/ponder/include/ponder/detail/util.hpp:37,
                 from /home/david/ponder/include/ponder/error.hpp:38,
                 from /home/david/ponder/include/ponder/enumget.hpp:37,
                 from /home/david/ponder/include/ponder/enum.hpp:39,
                 from /home/david/ponder/src/enumbuilder.cpp:32:
/usr/include/c++/4.8/bits/vector.tcc:134:5: note: std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::iterator) [with _Tp = std::pair<std::basic_string<char>, long int>; _Alloc = std::allocator<std::pair<std::basic_string<char>, long int> >; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<std::pair<std::basic_string<char>, long int>*, std::vector<std::pair<std::basic_string<char>, long int>, std::allocator<std::pair<std::basic_string<char>, long int> > > >; typename std::_Vector_base<_Tp, _Alloc>::pointer = std::pair<std::basic_string<char>, long int>*]
     vector<_Tp, _Alloc>::
     ^
/usr/include/c++/4.8/bits/vector.tcc:134:5: note:   no known conversion for argument 1 from ‘__gnu_cxx::__normal_iterator<const std::pair<std::basic_string<char>, long int>*, std::vector<std::pair<std::basic_string<char>, long int>, std::allocator<std::pair<std::basic_string<char>, long int> > > >’ to ‘std::vector<std::pair<std::basic_string<char>, long int>, std::allocator<std::pair<std::basic_string<char>, long int> > >::iterator {aka __gnu_cxx::__normal_iterator<std::pair<std::basic_string<char>, long int>*, std::vector<std::pair<std::basic_string<char>, long int>, std::allocator<std::pair<std::basic_string<char>, long int> > > >}’
/usr/include/c++/4.8/bits/vector.tcc:146:5: note: std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::iterator, std::vector<_Tp, _Alloc>::iterator) [with _Tp = std::pair<std::basic_string<char>, long int>; _Alloc = std::allocator<std::pair<std::basic_string<char>, long int> >; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<std::pair<std::basic_string<char>, long int>*, std::vector<std::pair<std::basic_string<char>, long int>, std::allocator<std::pair<std::basic_string<char>, long int> > > >; typename std::_Vector_base<_Tp, _Alloc>::pointer = std::pair<std::basic_string<char>, long int>*]
     vector<_Tp, _Alloc>::
     ^
/usr/include/c++/4.8/bits/vector.tcc:146:5: note:   candidate expects 2 arguments, 1 provided
make[2]: *** [CMakeFiles/ponder.dir/src/enumbuilder.cpp.o] Error 1
make[1]: *** [CMakeFiles/ponder.dir/all] Error 2
make: *** [all] Error 2
billyquith commented 8 years ago

Hi. Sorry I don't have a Linux machine. Will reformat old laptop to investigate.

billyquith commented 8 years ago

Reproduced this on Travis using "Trusty" linux box using Ubuntu 14.04.

In file included from /home/travis/build/billyquith/ponder/include/ponder/enum.hpp:41:
/home/travis/build/billyquith/ponder/include/ponder/detail/dictionary.hpp:123:24: error: 
      no matching member function for call to 'erase'
            m_contents.erase(it);
            ~~~~~~~~~~~^~~~~
/home/travis/build/billyquith/ponder/include/ponder/detail/dictionary.hpp:110:9: note: 
      in instantiation of member function
      'ponder::detail::Dictionary<std::basic_string<char>, long,
      ponder::Enum::EnumCmp>::erase' requested here
        erase(key);
        ^
/home/travis/build/billyquith/ponder/src/enumbuilder.cpp:48:23: note: in
      instantiation of member function
      'ponder::detail::Dictionary<std::basic_string<char>, long,
      ponder::Enum::EnumCmp>::insert' requested here
    m_target->m_enums.insert(name, value);
                      ^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_vector.h:1075:7: note: 
      candidate function not viable: no known conversion from
      '__normal_iterator<const std::pair<std::basic_string<char>, long> *,
      [...]>' to '__normal_iterator<pointer, [...]>' for 1st argument
      erase(iterator __position);
      ^
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_vector.h:1096:7: note: 
      candidate function not viable: requires 2 arguments, but 1 was provided
      erase(iterator __first, iterator __last);
      ^
1 error generated.
make[3]: *** [CMakeFiles/ponder.dir/src/enumbuilder.cpp.o] Error 1
make[2]: *** [CMakeFiles/ponder.dir/all] Error 2
make[1]: *** [test/CMakeFiles/pondertest.dir/rule] Error 2
make: *** [pondertest] Error 2

It looks to be the result of a bug in libstdc++. Which according to this is fixed in 4.9. Above version is 4.8.

billyquith commented 8 years ago

So one solution is to update your version of GCC 4.9+.