Quiero definir std::tr1::hash<boost::tuple<A,B,C> >
. Pero aparece un error que no aparece cuando doy una instancia completa. Aquí está el códigoUso de boost :: tuple en tr1 :: hash
namespace std{
namespace tr1{
template<typename A, typename B, typename C>
struct hash<boost::tuple<A,B,C> >{
size_t operator()(const boost::tuple<A,B,C> &t) const{
size_t seed = 0;
boost::hash_combine(seed, t.get<0>());
boost::hash_combine(seed, t.get<1>());
boost::hash_combine(seed, t.get<2>());
return seed;
}
};
template<>
struct hash<boost::tuple<int,int,int> >{
size_t operator()(const boost::tuple<int,int,int> &t) const{
size_t seed = 0;
boost::hash_combine(seed, t.get<0>());
boost::hash_combine(seed, t.get<1>());
boost::hash_combine(seed, t.get<2>());
return seed;
}
};
}
}
La primera pieza da este error
unordered.hpp: In member function 'size_t std::tr1::hash<boost::tuples::tuple<A, B, C, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >::operator()(const boost::tuples::tuple<A, B, C, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>&) const':
unordered.hpp:12: error: expected primary-expression before ')' token
unordered.hpp:13: error: expected primary-expression before ')' token
unordered.hpp:14: error: expected primary-expression before ')' token
y el segundo recoge muy bien. ¿Qué pasa con la primera plantilla? Estoy usando gcc 4.3.4.
¿No es 'std :: hash' una característica de C++ 11? En ese caso, puede usar 'std :: tuple' también. Creo que le falta una palabra clave 'typename'. – AJG85
Creo que 'boost :: hash' ya está definido para' boost :: tuple's. Si está utilizando la biblioteca estándar, ¡use 'std :: tuple' también! –
@ AJG85 Estoy usando gcc 4.3.4 donde 'hash' todavía está en' tr1' y 'tuple' está solo en boost. –