मैं निम्न कार्य करने की कोशिश कर रहा हूँ का समर्थन करने के बढ़ावा unordered_map बनाने के लिए: 'को बढ़ावा देने :: hash_value':फ्लाईवेट <string>
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> > map;
boost::flyweight<std::string> foo(name);
map[foo] = foo;
लेकिन संकलक शिकायत: "त्रुटि C2665 17 भार के में से कोई भी कर सकता है सभी तर्क प्रकारों को परिवर्तित करें "।
लेकिन मैं निम्नलिखित समारोह को परिभाषित किया है:
std::size_t hash_value(const boost::flyweight<std::string> & b)
{
boost::hash<std::string> hasher;
const std::string & str = b.get();
return hasher(str);
}
bool operator==(const boost::flyweight<std::string>& f, const boost::flyweight<std::string> & second)
{
return f.get() == second.get();
}
लेकिन यह नहीं करता है संकलन।
फ्लाईवेट का समर्थन करने के लिए मुझे unordered_map को बढ़ावा देने के लिए क्या करने की आवश्यकता है?
[संपादित करें] मैं इसे निम्न कोड के साथ काम करने के लिए मिल गया:
struct flyweight_hash
{
std::size_t operator()(const boost::flyweight<std::string> &elm) const
{
boost::hash<std::string> hasher;
const std::string & str = elm.get();
return hasher(str);
}
};
और नक्शे के निर्माण के लिए एक टेम्पलेट पैरामीटर के रूप में इसे पारित:
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> , flyweight_hash > map;
इस मामले में मैं हैश_वल्यू ने काम नहीं किया है, ओवरलोडिंग तरीका समझ में नहीं आया।
यह केवल खराब है क्योंकि 'boost :: unordered_map' का डिफ़ॉल्ट हैशर boost :: hash_value का उपयोग करके एडीएल को ट्रिगर नहीं करता है; वापसी हैश_वल्यू (कुंजी); '। मैं अभी यह जांच नहीं कर सकता हूं। – Xeo
@Xeo डिफ़ॉल्ट हैशर 'boost :: हैश' होना चाहिए और' unordered_map' के लिए विशिष्ट नहीं होना चाहिए। कम से कम डॉक्टर ऐसा कहते हैं। – pmr
निश्चित रूप से, लेकिन यह नहीं बदलेगा कि एडीएल-सक्षम कॉल का उपयोग नहीं किया जा रहा है। – Xeo