Использование string_view для поиска карты

Следующий код не может быть построен на последних компиляторах (g ++ — 5.3, clang ++ — 3.7).

#include <map>
#include <functional>
#include <experimental/string_view>

void f()
{
using namespace std;
using namespace std::experimental;
map<string, int> m;
string s = "foo";
string_view sv(s);
m.find(sv);
}

Ошибка возвращается clang:

error: no matching member function for call to 'find'
m.find(sv);
~~^~~~

Но не должен find быть в состоянии использовать сопоставимые типы?
Cppreference упоминает следующую перегрузку:

template< class K > iterator find( const K& x );

Такая же ошибка происходит с boost::string_ref,

20

Решение

Вам необходимо указать прозрачный компаратор явно (как std::less<>):

std::map<std::string, int, std::less<>> m;
//                         ~~~~~~~~~~^

std::map<K,V> по умолчанию его компаратор std::less<K> (т.е. непрозрачный один) и с тех пор ([Associative.reqmts] / р13):

Шаблоны функций-членов find, count, lower_bound, upper_bound, а также equal_range не должны участвовать в разрешении перегрузки, если только Квалифицированный-идентификатор Compare::is_transparent допустимо и обозначает тип (14.8.2).

функция-член шаблона find не является жизнеспособным кандидатом.

26

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]