Ho una classe modello Baz
che contiene una classe nidificata Sub
. Mi piacerebbe definire una funzione di hash per questa sottoclasse specializzando std :: hash. Tuttavia, non sembra funzionare.Specializzazione std :: hash per classe nidificata in una classe modello
#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 lamenta:
$ 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’
UPDATE
Quello che sto davvero cercando di fare è implementare un contenitore che supporta stabili riferimenti (non in C++ senso) agli elementi al suo interno. Voglio consentire all'utente di inserire questi riferimenti in std::unordered_set
e simili e usarli per accedere o modificare gli elementi esistenti in modo efficiente. Quello che segue è solo un mockup, non il contenitore esatto che sto implementando. Il problema è nel definire una funzione di hash per il tipo di riferimento.
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;
};
Qual è il caso d'uso per questo? Forse sarà più semplice specificare semplicemente una funzione hash esplicita per il tuo contenitore? –