Voglio definire std::tr1::hash<boost::tuple<A,B,C> >
. Ma ottengo un errore che non appare quando fornisco un'istanza completa. Ecco il codiceUtilizzo di boost :: tuple in 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;
}
};
}
}
Il primo pezzo dà questo errore
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
e la seconda compila bene. Cosa c'è che non va nel primo modello? Sto usando gcc 4.3.4.
Non è 'std :: hash' una funzionalità di C++ 11? In tal caso puoi usare anche 'std :: tuple'. Credo che manchi una parola chiave 'typename'. – AJG85
Penso che 'boost :: hash' sia già definito per' boost :: tuple's. Se stai usando la libreria standard, usa anche 'std :: tuple'! –
@ AJG85 Sto usando gcc 4.3.4 dove 'hash' è ancora in' tr1' e 'tuple' è solo in boost. –