c++ - Uso de string_view para la búsqueda de mapas
dictionary c++14 (1)
Debe especificar un comparador transparente explícitamente (como std::less<>
):
std::map<std::string, int, std::less<>> m;
// ~~~~~~~~~~^
std::map<K,V>
defecto su comparador a std::less<K>
(es decir, uno no transparente ), y desde ( [associative.reqmts]/p13 ):
Las plantillas de función miembro
find
,count
,lower_bound
,upper_bound
yequal_range
no participarán en la resolución de sobrecarga a menos que la identificación de id.Compare::is_transparent
sea válida y denote un tipo (14.8.2).
La función de find
miembro de plantilla no es un candidato viable.
El siguiente código no se basa en compiladores recientes (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);
}
Error devuelto por clang:
error: no matching member function for call to ''find''
m.find(sv);
~~^~~~
¿Pero no debería ser capaz de usar tipos comparables? Cppreference menciona la siguiente sobrecarga:
template< class K > iterator find( const K& x );
El mismo error ocurre con boost::string_ref
.