Tengo una clase de plantilla Baz
que contiene una clase anidada Sub
. Me gustaría definir una función hash para esta subclase al especializar std :: hash. Sin embargo, parece que no funciona.Especialización std :: hash para clase anidada en una clase de plantilla
#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 se queja:
$ 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’
ACTUALIZACIÓN
Lo que realmente estoy tratando de hacer es poner en práctica un contenedor que soporta estables referencias (no en el C++ sentido) a los elementos dentro de él. Quiero permitir al usuario insertar estas referencias en std::unordered_set
y similares, y usarlas para acceder o modificar elementos existentes de manera eficiente. Lo siguiente es solo una maqueta, no el contenedor exacto que estoy implementando. El problema está en definir una función hash para el tipo de referencia.
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;
};
¿Cuál es el caso de uso para esto? ¿Tal vez será más fácil simplemente especificar una función hash explícita para su contenedor? –