2016-02-20 25 views
11

以下代碼無法構建在最近的編譯器上(g ++ - 5.3,clang ++ - 3.7)。通過鐺返回使用string_view進行地圖查找

#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: no matching member function for call to 'find' 
    m.find(sv); 
    ~~^~~~ 

但不應find能夠使用可比類型? Cppreference提到了以下的過載:與boost::string_ref發生

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

相同的錯誤。

回答

16

你需要指定一個transparent comparator明確(如std::less<>):

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

std::map<K,V>默認的比較來std::less<K>(即非透明一),因爲([associative.reqmts]/p13):

成員函數模板find,count,lower_bound,upper_boundequal_range不得參與超載分辨率,除非合格代碼Compare::is_transparent有效並且表示類型(14.8.2)。

模板成員函數find不是一個可行的候選人。

+0

這個伎倆! –