2016-07-10 62 views
0

我已經創建std::unordered_map<CGPoint, unsigned int>,顯然,使它工作,我應該爲它編寫的散列函數:重載ObjC結構的C++無序容器哈希支持

namespace std { 
    template<> struct hash<CGPoint> { 
     inline size_t operator()(const CGPoint & v) const { 
      size_t seed = 0; 
      ::hash_combine(seed, v.x); 
      ::hash_combine(seed, v.y); 
      return seed; 
     } 
    }; 
}; 

但它沒有編制,而且我發現有是一個平等運營商應該定義的地方。所以我已經將以下代碼寫入模板結構中。

friend bool operator==(const CGPoint& p1, const CGPoint& p2) { 
    return (p1.x == p2.x) && (p1.y == p2.y); 
} 

但它不斷拋出異常:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/functional:659:21: 無效操作數的二進制表達式( 'const的CGPoint' 和 'const的 CGPoint')

和:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__hash_table:1993:32: 沒有用於調用類型爲'key_equal'的對象的匹配函數(又名 '的std :: __ 1 :: __ unordered_map_equal, 的std :: __ 1 :: equal_to,真>「)

最有可能的,我失去了一些東西很簡單,但因爲它通常會發生,我無法得到它。提前致謝。

+0

您是否嘗試過提供一個版本的''==這需要'常量CGPoint's而不是'常量CGPoint及單曲? – jtbandes

+0

它不工作。一旦你爲(&v)和(v)定義了func,函數調用就會變得模糊不清,因爲它們提供了相同的選項。它只會增加一些錯誤。 –

+0

這不是「拋出異常」。 –

回答

2

operator==應該是頂級功能,而不是朋友功能。

下面將編譯:

namespace std { 
    template<> struct hash<CGPoint> { 
     inline size_t operator()(const CGPoint & v) const { 
      size_t seed = 0; 
      ::hash_combine(seed, v.x); 
      ::hash_combine(seed, v.y); 
      return seed; 
     } 
    }; 
}; 

bool operator==(const CGPoint& p1, const CGPoint& p2) { 
    return (p1.x == p2.x) && (p1.y == p2.y); 
} 

int main() { 
    std::unordered_map<CGPoint, unsigned int> map; 
    map[CGPointMake(1, 1)] = 1; 
    return 0; 
} 
+0

它也可以是朋友,但是需要在課堂之外進行宣言,而不僅僅是朋友聲明。 –