2012-07-10 44 views
8

使用下面的代碼,我在MSVC中看到一個非常混亂的錯誤,它似乎暗示鍵類型(std :: tuple)正在轉換爲std: :串。使用std :: tuple作爲std :: unordered_map的密鑰

#include <iostream> 
#include <string> 
#include <tuple> 
#include <utility> 
#include <unordered_map> 

typedef std::tuple<std::string,int,char> key_t; 

struct key_hash : public std::unary_function<key_t, std::size_t> 
{ 
    std::size_t operator()(const key_t& k) const 
    { 
     return std::get<0>(k)[0]^std::get<1>(k)^std::get<2>(k); 
    } 
}; 

struct key_equal : public std::binary_function<key_t, key_t, bool> 
{ 
    bool operator()(const key_t& v0, const key_t& v1) const 
    { 
     return (
       std::get<0>(v0) == std::get<0>(v1) && 
       std::get<1>(v0) == std::get<1>(v1) && 
       std::get<2>(v0) == std::get<2>(v1) 
      ); 
    } 
}; 

struct data 
{ 
    std::string x; 
}; 

typedef std::unordered_map<key_t,data,key_hash,key_equal> map_t; 


int main() 
{ 
    map_t m; 
    data d; 
    d.x = "test data"; 
    m[std::make_tuple("abc",1,'X')] = d; 
    auto itr = m.find(std::make_tuple(std::string("abc"),1,'X')); 
    if (m.end() != itr) 
    { 
     std::cout << "x: " << itr->second.x; 
    } 
    return 0; 
} 

錯誤:

Error 1 error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> &)' : cannot convert parameter 1 from 'const std::tr1::tuple<_Arg0,_Arg1,_Arg2>' to 'const std::basic_string<_Elem,_Traits,_Ax> &' c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\tuple 127 1 

編譯器:微軟的Visual Studio 2010中

在ideone,我得到以下甚至更令人費解的錯誤:

http://ideone.com/yEv2j

我可以」 t似乎找出我出錯的地方。

+0

請注意,您不需要比較'std :: get <0>(v0)== std :: get <0>(v1)&& .....'這樣的鍵,而只需要編寫'return v0 = = v1'。 – Nawaz 2012-07-10 08:01:54

+0

@Nawaz:感謝您的評論,我試過了,但我仍然收到錯誤。 – Gerdiner 2012-07-10 08:03:15

+0

哪一行導致錯誤,第一行是make_tuple還是第二行? IdeOne錯誤顯示key_t被重新定義。嘗試重命名該類型。 – Ajay 2012-07-10 08:06:02

回答

2

奇怪。您的代碼在Visual Studio 2012 RC中正常工作,輸出爲「x:測試數據」。

+0

應該澄清,我正在使用MS visual studio 2010. – Gerdiner 2012-07-10 08:01:40

+0

在ideone錯誤是/usr/include/sys/types.h:123:17:錯誤:'key_t'有一個前面的聲明爲'typedef __key_t key_t ',所以它會與另一個typedef一起使用,但我不知道2012年VC。 – ForEveR 2012-07-10 08:04:04

+0

你是對的,我改變類型的名稱,它與ideone編譯,似乎可能有一個msvc中的錯誤:http://ideone.com/olN9W – Gerdiner 2012-07-10 08:07:09

4

爲ideone的問題是,key_t已經存在:

prog.cpp:7:42: error: conflicting declaration 'typedef class std::tuple<std::basic_string<char>, int, char> key_t' 
/usr/include/sys/types.h:123:17: error: 'key_t' has a previous declaration as 'typedef __key_t key_t' 

重命名key_t到別的東西,或者放入一些命名空間。

Your code works after this change in g ++ and clang ++。我相信這是MSVC中的一個錯誤。

相關問題