2016-02-20 10 views
11

Il seguente codice non riesce a creare compilatori recenti (g ++ - 5.3, clang ++ - 3.7).Uso di string_view per la ricerca della mappa

#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); 
} 

errore restituito dal clang:

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

Ma non find dovrebbe essere in grado di utilizzare i tipi comparabili? Cppreference cita il seguente overload:

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

Lo stesso errore accade con boost::string_ref.

risposta

16

è necessario specificare un transparent comparator in modo esplicito (come std::less<>):

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

std::map<K,V> default il suo comparatore per std::less<K> (vale a dire, un non trasparente uno), e dal momento che ([associative.reqmts]/p13):

I modelli di funzioni membro find, count, lower_bound, upper_bound e equal_range non partecipa alla risoluzione di sovraccarico a meno che l'id qualificato Compare::is_transparent sia valido e denoti un tipo (14.8.2).

la funzione membro modello find non è un candidato valido.

+0

questo ha fatto il trucco! –