gpt4 book ai didi

c++ - 在 tr1::hash 中使用 boost::tuple

转载 作者:可可西里 更新时间:2023-11-01 17:32:54 26 4
gpt4 key购买 nike

我想定义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。

最佳答案

您需要使用 .template关键词:

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.template get<0>());
boost::hash_combine(seed, t.template get<1>());
boost::hash_combine(seed, t.template get<2>());
return seed;
}
};

这是必需的,因为 t 的类型取决于三个模板参数(因此 t 是类型相关的),并且 get<0>是模板特化的名称。来自 C++ 标准——§14.2/4 :

When the name of a member template specialization appears after . or -> in a postfix-expression ... and the object expression of the postfix-expression is type-dependent ... the member template name must be prefixed by the keyword template. ...

此要求的存在是为了允许模板在其类型参数已知之前被解析。

例如,考虑:

f . set < 0 > ( 2 == 3 )

没有 .template规则,这可以解释为两种不同的东西:

//A call to an instantiation of a member function template
//in this case equivalent to f.template set<0>(false)
f.set<0>(2 == 3)
//A series of comparison operations, in this case equivalent to
//f.set < 0
f.set < 0 > (2 == 3)

实际规则允许f . set < 0 > ( 2 == 3 )被明确地解析为一系列比较操作。他们也意味着 t.get<0>()被解析为 t.get < 0 > () . expected primary-expression本来就是空的() .

关于c++ - 在 tr1::hash 中使用 boost::tuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8185870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com