[Boost-bugs] [Boost C++ Libraries] #7367: Ambiguity with nested list_of on C++11/C++0x compilers

Subject: [Boost-bugs] [Boost C++ Libraries] #7367: Ambiguity with nested list_of on C++11/C++0x compilers
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2012-09-12 07:50:33


#7367: Ambiguity with nested list_of on C++11/C++0x compilers
--------------------------------+-------------------------------------------
 Reporter: zadirion@… | Owner: nesotto
     Type: Bugs | Status: new
Milestone: To Be Determined | Component: assign
  Version: Boost 1.52.0 | Severity: Regression
 Keywords: |
--------------------------------+-------------------------------------------
 The following code compiles in VS2010, however when compiled with VS2012
 or GCC 4.7.1 it no longer compiles.

 {{{

 #include "stdafx.h"
 #include <string>
 #include <vector>
 #include <boost/assign.hpp>

 using namespace std;

 typedef wstring IssueInfo;

 typedef vector<IssueInfo> IssuesAndFixes;

 typedef pair<wstring, IssuesAndFixes> IssueCategoryEntry;

 typedef vector<IssueCategoryEntry> IssuesAndFixesMap;

 extern const IssuesAndFixesMap kIssuesAndFixes;

 IssuesAndFixes dummy;

 const IssuesAndFixesMap kIssuesAndFixes =
   boost::assign::list_of<IssueCategoryEntry>
   (
     wstring(), boost::assign::list_of<IssueInfo>
     (
     )
   );

 int main()
 {
   return 0;
 }
 }}}

 Error in GCC is:
 {{{

 Compilation finished with errors:
 In file included from include/c++/4.7.1/bits/stl_algobase.h:65:0,
                  from include/c++/4.7.1/bits/char_traits.h:41,
                  from include/c++/4.7.1/string:42,
                  from source.cpp:1:
 include/c++/4.7.1/bits/stl_pair.h: In instantiation of 'constexpr
 std::pair<_T1, _T2>::pair(const _T1&, _U2&&) [with _U2 = const
 boost::assign_detail::generic_list<std::basic_string<wchar_t> >&;
 <template-parameter-2-2> = void; _T1 = std::basic_string<wchar_t>; _T2 =
 std::vector<std::basic_string<wchar_t> >]':
 boost/preprocessor/iteration/detail/local.hpp:37:1: required from
 'boost::assign_detail::generic_list<T>&
 boost::assign_detail::generic_list<T>::operator()(const U&, const U0&)
 [with U = std::basic_string<wchar_t>; U0 =
 boost::assign_detail::generic_list<std::basic_string<wchar_t> >; T =
 std::pair<std::basic_string<wchar_t>,
 std::vector<std::basic_string<wchar_t> > >;
 boost::assign_detail::generic_list<T> =
 boost::assign_detail::generic_list<std::pair<std::basic_string<wchar_t>,
 std::vector<std::basic_string<wchar_t> > > >]'
 boost/preprocessor/iteration/detail/local.hpp:37:1: required from
 'boost::assign_detail::generic_list<T> boost::assign::list_of(const U&,
 const U0&) [with T = std::pair<std::basic_string<wchar_t>,
 std::vector<std::basic_string<wchar_t> > >; U =
 std::basic_string<wchar_t>; U0 =
 boost::assign_detail::generic_list<std::basic_string<wchar_t> >]'
 source.cpp:25:3: required from here
 include/c++/4.7.1/bits/stl_pair.h:137:45: error: call of overloaded
 'vector(const
 boost::assign_detail::generic_list<std::basic_string<wchar_t> >&)' is
 ambiguous
 include/c++/4.7.1/bits/stl_pair.h:137:45: note: candidates are:
 In file included from include/c++/4.7.1/vector:65:0,
                  from source.cpp:2:
 include/c++/4.7.1/bits/stl_vector.h:361:7: note: std::vector<_Tp,
 _Alloc>::vector(std::initializer_list<_Tp>, const allocator_type&) [with
 _Tp = std::basic_string<wchar_t>; _Alloc =
 std::allocator<std::basic_string<wchar_t> >; std::vector<_Tp,
 _Alloc>::allocator_type = std::allocator<std::basic_string<wchar_t> >]
 include/c++/4.7.1/bits/stl_vector.h:324:7: note: std::vector<_Tp,
 _Alloc>::vector(std::vector<_Tp, _Alloc>&&) [with _Tp =
 std::basic_string<wchar_t>; _Alloc =
 std::allocator<std::basic_string<wchar_t> >; std::vector<_Tp, _Alloc> =
 std::vector<std::basic_string<wchar_t> >]
 include/c++/4.7.1/bits/stl_vector.h:307:7: note: std::vector<_Tp,
 _Alloc>::vector(const std::vector<_Tp, _Alloc>&) [with _Tp =
 std::basic_string<wchar_t>; _Alloc =
 std::allocator<std::basic_string<wchar_t> >; std::vector<_Tp, _Alloc> =
 std::vector<std::basic_string<wchar_t> >]
 include/c++/4.7.1/bits/stl_vector.h:266:7: note: std::vector<_Tp,
 _Alloc>::vector(std::vector<_Tp, _Alloc>::size_type) [with _Tp =
 std::basic_string<wchar_t>; _Alloc =
 std::allocator<std::basic_string<wchar_t> >; std::vector<_Tp,
 _Alloc>::size_type = unsigned int]
 include/c++/4.7.1/bits/stl_vector.h:254:7: note: std::vector<_Tp,
 _Alloc>::vector(const allocator_type&) [with _Tp =
 std::basic_string<wchar_t>; _Alloc =
 std::allocator<std::basic_string<wchar_t> >; std::vector<_Tp,
 _Alloc>::allocator_type = std::allocator<std::basic_string<wchar_t> >]


 }}}

 Adding a '''to_container(dummy)''' call on the second list_of fixes the
 issue though.

 Example:
 liveworkspace.org/code/38e5fafed72adf0730ad71ebb599c97e

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/7367>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:10 UTC