Boost logo

Boost :

Subject: [boost] [container] [flat_map] Error with heterogeneous comparator and std::string_view
From: Viktor Sehr (viktor.sehr_at_[hidden])
Date: 2018-08-12 16:26:43

On MSVC (latest) the following code yields a compile error with flat_map,
but not with std::map. I do not have the knowledge of std::less<> to
resolve what causes the error.

auto fm = boost::container::flat_map<std::string, int, std::less<> >{};
auto m = std::map<std::string, int, std::less<> >{};
auto k = std::string_view{ "my_key" };
auto x = m.find(k); // Compiles
auto y = fm.find(k); // Does NOT compile

Error message:
1>boost\container\flat_map.hpp(1314): error C2664:
'boost::container::vec_iterator<boost::container::dtl::pair<Key,T> *,true>
std::basic_string<char,std::char_traits<char>,std::allocator<char>> &)
const': cannot convert argument 1 from 'const std::string_view' to 'const
std::basic_string<char,std::char_traits<char>,std::allocator<char>> &'
1> with
1> [
1> Key=std::string,
1> T=int,
1> Compare=std::less<void>,
1> T2=boost::container::dtl::pair<std::string,int>
1> ]
1> boost\container\flat_map.hpp(1314): note: Reason: cannot convert from
'const std::string_view' to 'const
1> boost\container\flat_map.hpp(1314): note: No user-defined-conversion
operator available that can perform this conversion, or the operator cannot
be called

Best regards

Boost list run by bdawes at, gregod at, cpdaniel at, john at