2012-01-28 18 views
6

हाल ही में मैं और अधिक कर रहा हूँ सी ++ से स्काला प्रोग्रामिंग भाषा के एक उपयोगकर्ता, और अब मैं कोड का एक बहुत ही सरल रेखा पोर्टिंग में निराश हूँGLM :: अव्यवस्थित नक्शे में कुंजी के रूप में ivec2

val map = new HashMap[Vec2i,Entity] 

यह बस लिए मना कर दिया अजीब टेम्पलेट त्रुटियों के साथ सी ++ में संकलित करें। सी ++ में Vec2i के समतुल्य glm :: ivec2 है, यह मूल रूप से गणित के लिए दो पूर्णांक और कुछ ऑपरेटरों के साथ एक संरचना है।

#include <iostream> 
#include <unordered_map> 
#include <glm/glm.hpp> 

using namespace std; 
using namespace glm; 

struct KeyTraits { 
size_t operator()(const ivec2& k) { 
     return std::hash<int>()(k.x)^std::hash<int>()(k.y); 
    } 

bool operator()(const ivec2& a, const ivec2& b) { 
     return a.x == b.x && a.y == b.y; 
    } 
}; 

typedef unordered_map<ivec2,int,KeyTraits,KeyTraits> MyMap; 

int main(int argc, char **argv) 
{ 
    MyMap map; 

    map[ivec2(2,3)] = 7; 
    map[ivec2(3,4)] = 8; 

    for(auto it = map.begin(); it != map.end(); it++) { 
     cout << it->second << endl; 
    } 
} 

वर्तमान संकलन त्रुटि है:

इस मैं कितनी दूर हो गया है

In file included from /usr/include/c++/4.5/bits/hashtable.h:35:0, 
      from /usr/include/c++/4.5/unordered_map:45, 
      from /home/arne/codelite/LanguageTest/main.cpp:2: 
/usr/include/c++/4.5/bits/hashtable_policy.h: In member function ‘std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _Equal, _H1, _H2, std::__detail::_Default_ranged_hash, false>::_Hash_code_type std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _Equal, _H1, _H2, std::__detail::_Default_ranged_hash, false>::_M_hash_code(const _Key&) const [with _Key = glm::detail::tvec2<int>, _Value = std::pair<const glm::detail::tvec2<int>, int>, _ExtractKey = std::_Select1st<std::pair<const glm::detail::tvec2<int>, int> >, _Equal = KeyTraits, _H1 = KeyTraits, _H2 = std::__detail::_Mod_range_hashing, std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _Equal, _H1, _H2, std::__detail::_Default_ranged_hash, false>::_Hash_code_type = long unsigned int]’: 
/usr/include/c++/4.5/bits/hashtable_policy.h:535:74: instantiated from ‘std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator[](const _Key&) [with _Key = glm::detail::tvec2<int>, _Pair = std::pair<const glm::detail::tvec2<int>, int>, _Hashtable = std::_Hashtable<glm::detail::tvec2<int>, std::pair<const glm::detail::tvec2<int>, int>, std::allocator<std::pair<const glm::detail::tvec2<int>, int> >, std::_Select1st<std::pair<const glm::detail::tvec2<int>, int> >, KeyTraits, KeyTraits, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>, std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = int]’ 
/home/arne/codelite/LanguageTest/main.cpp:24:16: instantiated from here 
/usr/include/c++/4.5/bits/hashtable_policy.h:727:25: error: passing ‘const KeyTraits’ as ‘this’ argument of ‘size_t KeyTraits::operator()(const glm::core::type::ivec2&)’ discards qualifiers 
/usr/include/c++/4.5/bits/hashtable_policy.h: In member function ‘bool std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _Equal, _H1, _H2, std::__detail::_Default_ranged_hash, false>::_M_compare(const _Key&, std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _Equal, _H1, _H2, std::__detail::_Default_ranged_hash, false>::_Hash_code_type, std::__detail::_Hash_node<_Value, false>*) const [with _Key = glm::detail::tvec2<int>, _Value = std::pair<const glm::detail::tvec2<int>, int>, _ExtractKey = std::_Select1st<std::pair<const glm::detail::tvec2<int>, int> >, _Equal = KeyTraits, _H1 = KeyTraits, _H2 = std::__detail::_Mod_range_hashing, std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _Equal, _H1, _H2, std::__detail::_Default_ranged_hash, false>::_Hash_code_type = long unsigned int]’: 
/usr/include/c++/4.5/bits/hashtable.h:879:2: instantiated from ‘std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Node* std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_find_node(std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Node*, const key_type&, typename std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Hash_code_type) const [with _Key = glm::detail::tvec2<int>, _Value = std::pair<const glm::detail::tvec2<int>, int>, _Allocator = std::allocator<std::pair<const glm::detail::tvec2<int>, int> >, _ExtractKey = std::_Select1st<std::pair<const glm::detail::tvec2<int>, int> >, _Equal = KeyTraits, _H1 = KeyTraits, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Node = std::__detail::_Hash_node<std::pair<const glm::detail::tvec2<int>, int>, false>, key_type = glm::detail::tvec2<int>, typename std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Hash_code_type = long unsigned int]’ 
/usr/include/c++/4.5/bits/hashtable_policy.h:540:53: instantiated from ‘std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator[](const _Key&) [with _Key = glm::detail::tvec2<int>, _Pair = std::pair<const glm::detail::tvec2<int>, int>, _Hashtable = std::_Hashtable<glm::detail::tvec2<int>, std::pair<const glm::detail::tvec2<int>, int>, std::allocator<std::pair<const glm::detail::tvec2<int>, int> >, std::_Select1st<std::pair<const glm::detail::tvec2<int>, int> >, KeyTraits, KeyTraits, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>, std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = int]’ 
/home/arne/codelite/LanguageTest/main.cpp:24:16: instantiated from here 
/usr/include/c++/4.5/bits/hashtable_policy.h:742:48: error: passing ‘const KeyTraits’ as ‘this’ argument of ‘bool KeyTraits::operator()(const glm::core::type::ivec2&, const glm::core::type::ivec2&)’ discards qualifiers 
/usr/include/c++/4.5/bits/hashtable_policy.h: In member function ‘size_t std::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _Equal, _H1, _H2, std::__detail::_Default_ranged_hash, false>::_M_bucket_index(const std::__detail::_Hash_node<_Value, false>*, size_t) const [with _Key = glm::detail::tvec2<int>, _Value = std::pair<const glm::detail::tvec2<int>, int>, _ExtractKey = std::_Select1st<std::pair<const glm::detail::tvec2<int>, int> >, _Equal = KeyTraits, _H1 = KeyTraits, _H2 = std::__detail::_Mod_range_hashing, size_t = long unsigned int]’: 
/usr/include/c++/4.5/bits/hashtable.h:1170:59: instantiated from ‘void std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_rehash(std::_Hashtable::size_type) [with _Key = glm::detail::tvec2<int>, _Value = std::pair<const glm::detail::tvec2<int>, int>, _Allocator = std::allocator<std::pair<const glm::detail::tvec2<int>, int> >, _ExtractKey = std::_Select1st<std::pair<const glm::detail::tvec2<int>, int> >, _Equal = KeyTraits, _H1 = KeyTraits, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, std::_Hashtable::size_type = long unsigned int]’ 
/usr/include/c++/4.5/bits/hashtable.h:911:8: instantiated from ‘std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::iterator std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_insert_bucket(const value_type&, std::_Hashtable::size_type, typename std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Hash_code_type) [with _Key = glm::detail::tvec2<int>, _Value = std::pair<const glm::detail::tvec2<int>, int>, _Allocator = std::allocator<std::pair<const glm::detail::tvec2<int>, int> >, _ExtractKey = std::_Select1st<std::pair<const glm::detail::tvec2<int>, int> >, _Equal = KeyTraits, _H1 = KeyTraits, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::iterator = std::__detail::_Hashtable_iterator<std::pair<const glm::detail::tvec2<int>, int>, false, false>, value_type = std::pair<const glm::detail::tvec2<int>, int>, std::_Hashtable::size_type = long unsigned int, typename std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Hash_code_type = long unsigned int]’ 
/usr/include/c++/4.5/bits/hashtable_policy.h:543:24: instantiated from ‘std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator[](const _Key&) [with _Key = glm::detail::tvec2<int>, _Pair = std::pair<const glm::detail::tvec2<int>, int>, _Hashtable = std::_Hashtable<glm::detail::tvec2<int>, std::pair<const glm::detail::tvec2<int>, int>, std::allocator<std::pair<const glm::detail::tvec2<int>, int> >, std::_Select1st<std::pair<const glm::detail::tvec2<int>, int> >, KeyTraits, KeyTraits, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>, std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = int]’ 
/home/arne/codelite/LanguageTest/main.cpp:24:16: instantiated from here 
/usr/include/c++/4.5/bits/hashtable_policy.h:737:55: error: passing ‘const KeyTraits’ as ‘this’ argument of ‘size_t KeyTraits::operator()(const glm::core::type::ivec2&)’ discards qualifiers 

उत्तर

5

आपको अपने टाइपिफ़ में एक हैश क्लास और एक तुलनित्र श्रेणी निर्दिष्ट करने की आवश्यकता है। देखें टेम्पलेट पैरामीटर हैश और KeyEqual यहाँ: http://en.cppreference.com/w/cpp/container/unordered_map

यह है कि तरह दिखेगा (विधि हस्ताक्षर के अंत में स्थिरांक क्वालिफायर पर विचार करें):,

struct KeyFuncs 
{ 
    size_t operator()(const ivec2& k)const 
    { 
     return std::hash<int>()(k.x)^std::hash<int>()(k.y); 
    } 

    bool operator()(const ivec2& a, const ivec2& b)const 
    { 
      return a.x == b.x && a.y == b.y; 
    } 
}; 


typedef unordered_map<ivec2,int,KeyFuncs,KeyFuncs> MyMap; 
+0

मुझे खेद है, मैंने ओवरफ्लो ढेर करने के लिए अपनी समस्या का निर्यात करने में गलती की। कार्यक्रम अभी होना चाहिए। मेरी समस्या यह है कि वे टेम्पलेट त्रुटि संदेश मेरे लिए बिल्कुल बेकार हैं, क्योंकि मैं उन्हें पढ़ नहीं सकता। – Arne

+0

क्या आपने इसे हल किया? कॉन्स्ट क्वालिफायर पर एक नज़र डालें (संपादन देखें)। – Sam

+0

आपका स्वागत है। इस अवसर पर, मैंने अधिक उपयुक्त नामकरण के लिए एक संपादन किया। – Sam

2

बस लिंकर त्रुटि को देखो, यह आपको बताता है कि आप क्या लागू या सूची प्रदान करना चाहिए टेम्पलेट तर्कों की:

std::hash<glm::detail::tvec2<int> >::operator()(glm::detail::tvec2<int>) const 

कार्यक्रम वेक्टर के आधार पर एक हैश बनाने के लिए कैसे पता नहीं है वस्तु। आपको अपने हैश की गणना करनी होगी, इसलिए नक्शा कोड वैक्टरों के बीच अंतर करने में सक्षम है।

संपादित करें: मैं, वैक्टर की ओर इशारा उपयोग करने के लिए अगर आप कुछ तत्व जोड़ सकते हैं और बाद में इसे बदल के रूप में इस अप पेंच सकता करते हैं (ताकि आप स्थिरांक वस्तुओं जोड़ना चाहिए)।


संपादित करें 2: अद्यतन कोड/त्रुटि संदेश के साथ, ऐसा लगता है जैसे आप KeyTaits स्थिरांक अंदर तरीकों बनाने के लिए है, इसलिए उनके this सूचक प्रकार KeyTraits* की है भूल गया, लेकिन भेजे गए मान const KeyTraits* करने के लिए है ।

+0

मैं मेरी समस्या एक छोटा सा बदल क्योंकि पहली त्रुटि संदेश यहां मेरी असली समस्या नहीं थी, यह बाहरी परियोजना में इसे सही ढंग से पोर्ट करने में अधिक गलत था। – Arne

+0

मेरा जवाब अपडेट किया गया। इस मामले में – Mario

+0

पॉइंटर्स नौकरी नहीं कर रहे हैं, क्योंकि मैं कहीं और एक वेक्टर की गणना करता हूं और इस ऑब्जेक्ट के लिए मौसम की जांच करने की आवश्यकता होती है। पॉइंटर्स के साथ ऐसा करने से हमेशा कोई मूल्य नहीं मिलेगा, क्योंकि उनके पते अलग हैं। – Arne

संबंधित मुद्दे