我想定义std::tr1::hash<boost::tuple<A,B,C> >
,但是当我给出完整的实例化时不会出现错误。以下是代码:
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;
}
};
}
}
第一段出现了错误
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
第一个模板有问题,无法编译通过。第二个模板没有问题。我使用的是gcc 4.3.4。
std::hash
不是 C++11 的特性吗?如果是的话,您也可以使用std::tuple
。我认为您缺少了一个typename
关键字。 - AJG85boost::hash
已经为boost::tuple
定义过了。如果您正在使用标准库,请也使用std::tuple
! - Kerrek SBhash
仍然在tr1
中,而tuple
只在boost中。 - pythonic metaphor<tr1/tuple>
中的std::tr1::tuple
... - Kerrek SB