2016-02-20 23 views
11

Aşağıdaki kod, yeni derleyicilerde yapılamadı (g ++ - 5.3, clang ++ - 3.7). clang tarafından döndürülenHarita araması için string_view öğesinin kullanımı

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

Hata:

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

Ama find karşılaştırılabilir türleri kullanmak gerekir?

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

aynı hata boost::string_ref ile olur: Cppreference aşağıdaki aşırı bahseder.

cevap

16

Açıkça (gibi std::less<>) bir transparent comparator belirtmek gerekir:

:

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

std::map<K,V> varsayılan std::less<K> (yani bir şeffaf olmayan bir) ve ([associative.reqmts]/p13) beri onun karşılaştırıcı

Üye işlev şablonları find, count, lower_bound, upper_bound ve equal_range, nitelikli kimlik numarasıCompare::is_transparent geçerli olmadıkça ve bir tür (14.8.2) belirtmedikçe aşırı yük çözünürlüğüne katılmamalıdır. Şablon üye işlevi , geçerli bir aday değil.

+0

Bu hile yaptı! –