Tôi cố gắng để làm như sau:Làm thế nào để làm tăng unordered_map để hỗ trợ hạng ruồi <string>
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> > map;
boost::flyweight<std::string> foo(name);
map[foo] = foo;
Nhưng trình biên dịch phàn nàn: "lỗi C2665: 'đẩy mạnh :: hash_value': không ai trong số 17 quá tải có thể chuyển đổi tất cả các loại đối số ".
Nhưng tôi đã xác định các chức năng sau:
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();
}
Nhưng nó doesn't biên dịch.
Tôi cần làm gì để tăng unordered_map để hỗ trợ trọng tải?
[EDIT] tôi đã nhận nó để làm việc với đoạn mã sau:
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);
}
};
và thông qua nó như một tham số mẫu để xây dựng các bản đồ:
boost::unordered_map<boost::flyweight<std::string>, boost::flyweight<std::string> , flyweight_hash > map;
Trong trường hợp này tôi không hiểu cách quá tải hash_value đã không làm việc.
Nó chỉ xấu vì hasher mặc định của 'boost :: unordered_map' dường như không kích hoạt ADL bằng' using boost :: hash_value; return hash_value (khóa); Tôi không thể kiểm tra ngay bây giờ. – Xeo
@Xeo Mặc định hasher nên là 'boost :: hash' và không nên cụ thể cho' unordered_map'. Ít nhất là doc nói vậy. – pmr
Chắc chắn, nhưng điều đó không thay đổi các cuộc gọi hỗ trợ ADL dường như không được sử dụng. – Xeo