Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compile failure in C++11 mode with g++-4.6 #13

Closed
c42f opened this issue Sep 12, 2013 · 4 comments
Closed

Compile failure in C++11 mode with g++-4.6 #13

c42f opened this issue Sep 12, 2013 · 4 comments

Comments

@c42f
Copy link
Contributor

c42f commented Sep 12, 2013

Hi guys,

Thanks for the great library. I've just started playing with it for point cloud matching of airborne lidar scans, and so far it's looking much more robust than I could reasonably have expected :-)

I've come across one small issue with the compile - we build all our stuff in C++11 mode using g++-4.6 or later, and I'm getting a compile error, which appears to relate to the boost initialization stuff. (The build works fine if I compile in C++98 mode.)

The error is a horrible mess of template badness which I'll paste in below. I'm not sure whether it's possible to fix directly, but I'd be happy to make a patch which changes all this to use C array initialization and a small amount of parsing code to create the bibliography.

Here's the error I get with g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

In file included from /usr/include/c++/4.6/bits/stl_algobase.h:65:0,
                from /usr/include/c++/4.6/bits/stl_tree.h:63,
                from /usr/include/c++/4.6/map:60,
                from /home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.h:39,
                from /home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.cpp:36:
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[23], _U2 = const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&, <template-parameter-2-3> = void, _T1 = std::basic_string<char>, _T2 = std::map<std::basic_string<char>, std::basic_string<char> >]’:
/home/cfoster/ROAMES_git/Components/ThirdParty/cmake/build/dist/boost-1.54.0/include/boost/preprocessor/iteration/detail/local.hpp:37:1:   instantiated from ‘boost::assign_detail::generic_list<T>& boost::assign_detail::generic_list<T>::operator()(const U&, const U0&) [with U = char [23], U0 = boost::assign_detail::generic_list<std::pair<const char*, const char*> >, T = std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > >, boost::assign_detail::generic_list<T> = boost::assign_detail::generic_list<std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > > >]’
/home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.cpp:92:4:   instantiated from here
/usr/include/c++/4.6/bits/stl_pair.h:132:64: error: call of overloaded ‘map(const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&)’ is ambiguous
/usr/include/c++/4.6/bits/stl_pair.h:132:64: note: candidates are:
/usr/include/c++/4.6/bits/stl_map.h:197:7: note: 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::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_map.h:183:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:172:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:161:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[20], _U2 = const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&, <template-parameter-2-3> = void, _T1 = std::basic_string<char>, _T2 = std::map<std::basic_string<char>, std::basic_string<char> >]’:
/home/cfoster/ROAMES_git/Components/ThirdParty/cmake/build/dist/boost-1.54.0/include/boost/preprocessor/iteration/detail/local.hpp:37:1:   instantiated from ‘boost::assign_detail::generic_list<T>& boost::assign_detail::generic_list<T>::operator()(const U&, const U0&) [with U = char [20], U0 = boost::assign_detail::generic_list<std::pair<const char*, const char*> >, T = std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > >, boost::assign_detail::generic_list<T> = boost::assign_detail::generic_list<std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > > >]’
/home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.cpp:103:4:   instantiated from here
/usr/include/c++/4.6/bits/stl_pair.h:132:64: error: call of overloaded ‘map(const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&)’ is ambiguous
/usr/include/c++/4.6/bits/stl_pair.h:132:64: note: candidates are:
/usr/include/c++/4.6/bits/stl_map.h:197:7: note: 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::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_map.h:183:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:172:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:161:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[17], _U2 = const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&, <template-parameter-2-3> = void, _T1 = std::basic_string<char>, _T2 = std::map<std::basic_string<char>, std::basic_string<char> >]’:
/home/cfoster/ROAMES_git/Components/ThirdParty/cmake/build/dist/boost-1.54.0/include/boost/preprocessor/iteration/detail/local.hpp:37:1:   instantiated from ‘boost::assign_detail::generic_list<T>& boost::assign_detail::generic_list<T>::operator()(const U&, const U0&) [with U = char [17], U0 = boost::assign_detail::generic_list<std::pair<const char*, const char*> >, T = std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > >, boost::assign_detail::generic_list<T> = boost::assign_detail::generic_list<std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > > >]’
/home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.cpp:125:4:   instantiated from here
/usr/include/c++/4.6/bits/stl_pair.h:132:64: error: call of overloaded ‘map(const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&)’ is ambiguous
/usr/include/c++/4.6/bits/stl_pair.h:132:64: note: candidates are:
/usr/include/c++/4.6/bits/stl_map.h:197:7: note: 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::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_map.h:183:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:172:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:161:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[19], _U2 = const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&, <template-parameter-2-3> = void, _T1 = std::basic_string<char>, _T2 = std::map<std::basic_string<char>, std::basic_string<char> >]’:
/home/cfoster/ROAMES_git/Components/ThirdParty/cmake/build/dist/boost-1.54.0/include/boost/preprocessor/iteration/detail/local.hpp:37:1:   instantiated from ‘boost::assign_detail::generic_list<T>& boost::assign_detail::generic_list<T>::operator()(const U&, const U0&) [with U = char [19], U0 = boost::assign_detail::generic_list<std::pair<const char*, const char*> >, T = std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > >, boost::assign_detail::generic_list<T> = boost::assign_detail::generic_list<std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > > >]’
/home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.cpp:147:4:   instantiated from here
/usr/include/c++/4.6/bits/stl_pair.h:132:64: error: call of overloaded ‘map(const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&)’ is ambiguous
/usr/include/c++/4.6/bits/stl_pair.h:132:64: note: candidates are:
/usr/include/c++/4.6/bits/stl_map.h:197:7: note: 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::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_map.h:183:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:172:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:161:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
make[2]: *** [CMakeFiles/pointmatcher.dir/pointmatcher/Bibliography.cpp.o] Error 1
make[1]: *** [CMakeFiles/pointmatcher.dir/all] Error 2
make: *** [all] Error 2
@stephanemagnenat
Copy link
Collaborator

As I understand these errors, some template-based deduction becomes ambiguous with C++11 because of the extended expressivity of the language. I see two solutions:

  1. make it work by adding the necessary explicit cast/template parameters/initializers/...
  2. have an ifdef and use std::initializer_lists while using C++11

The solution 1. is the cleanest in my opinion.

@c42f
Copy link
Contributor Author

c42f commented Sep 12, 2013

Agreed that solution 1. is much better than 2.

After some investigation, I think the issue here may be that std::map now has additional constructors, and some of the conflict with the assign_detail::generic_list implicit conversion operator to std::map. Surprisingly, most of the expected hacks to work around this problem don't actually work (eg, explicitly calling the StringMap constructor, calling map_list_of with explicit types).

Introducing a layer of indirection does work however, I will submit a pull request.

@stephanemagnenat
Copy link
Collaborator

Thank you!

@stephanemagnenat
Copy link
Collaborator

Fixed by pull request #14.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants