Tôi có một lớp mẫu Baz
có chứa một lớp lồng nhau Sub
. Tôi muốn xác định một hàm băm cho lớp con này bởi chuyên std :: hash. Tuy nhiên, nó dường như không hoạt động.Chuyên std :: băm cho lớp lồng nhau trong một lớp mẫu
#include <functional>
struct Foo {
struct Sub {
};
};
template <class T>
struct Bar {
};
template <class T>
struct Baz {
struct Sub {
int x;
};
};
// declare hash for Foo::Sub - all right
namespace std {
template <>
struct hash<Foo::Sub>;
}
// declare hash for Bar<T> - all right
namespace std {
template <class T>
struct hash< Bar<T> >;
}
// declare hash function for Baz<T>::Sub - doesn't work!
namespace std {
template <class T>
struct hash< Baz<T>::Sub >;
}
// Adding typename produces a different error.
namespace std {
template <class T>
struct hash< typename Baz<T>::Sub >;
}
Gcc 4.5.3 phàn nàn:
$ g++ -std=c++0x -c hash.cpp
hash.cpp:34:30: error: type/value mismatch at argument 1 in template parameter list for ‘template<class _Tp> struct std::hash’
hash.cpp:34:30: error: expected a type, got ‘Baz<T>::Sub’
hash.cpp:40:12: error: template parameters not used in partial specialization:
hash.cpp:40:12: error: ‘T’
CẬP NHẬT
Những gì tôi đang thực sự cố gắng làm là thực hiện một container mà hỗ trợ tài liệu tham khảo ổn định (không phải trong C++ ý nghĩa) cho các phần tử bên trong nó. Tôi muốn cho phép người dùng chèn các tham chiếu này vào std::unordered_set
và tương tự, đồng thời sử dụng chúng để truy cập hoặc sửa đổi các thành phần hiện có một cách hiệu quả. Sau đây chỉ là một mockup, không phải là container chính xác tôi đang thực hiện. Vấn đề là xác định hàm băm cho kiểu tham chiếu.
template <class T>
class Container {
public:
class Reference {
public:
// operator==, operator!=, operator< ...., isNull()
private:
size_t index; // index into m_entries (or could be anything else)
// possibly more stuff
};
Reference insert (const T &value);
Reference find (const T &value);
void remove (Reference r);
Reference first();
Reference next (Reference prev);
private:
struct Entry { T value, ... };
std::vector<Entry> m_entries;
};
các usecase cho điều này là gì? Có lẽ sẽ dễ dàng hơn khi chỉ định hàm băm rõ ràng cho vùng chứa của bạn? –