gpt4 book ai didi

c++ - 使用 std::tuple_element 时无效使用不完整类型的问题

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:33 26 4
gpt4 key购买 nike

以下代码为 std::tuple 实现哈希函数然后在我的代码库的不同部分中使用 std::unordered_mapstd::tuple

// compute hash function recursively through each std::tuple element
template<class Tuple, std::size_t N>
struct tuple_hash_compute {
static std::size_t hash_compute(const Tuple& t) {
using type = typename std::tuple_element<N-1, decltype(t)>::type; // OFFENDING LINE
return tuple_hash_compute<Tuple, N-1>::hash_compute(t)
+ std::hash<type>()(std::get<N-1>(t));
}
};
// base helper
template<class Tuple>
struct tuple_hash_compute<Tuple, 1> {
static std::size_t hash_compute(const Tuple& t) {
using type = typename std::tuple_element<0, decltype(t)>::type; // OFFENDING LINE
return 51U + std::hash<type>()(std::get<0>(t))*51U;
}
};
// tuple_hash function object
struct tuple_hash {
template<class... Args>
std::size_t operator()(const std::tuple<Args...>& t) const {
return tuple_hash_compute<decltype(t), sizeof...(Args)>::hash_compute(t);
}
// will use std::unordered_map of std::pair too, so overload reqd
template<class Ty1, class Ty2>
std::size_t operator()(const std::pair<Ty1, Ty2>& p) const {
return tuple_hash_compute<decltype(t), 2>::hash_compute(p);
}
};

然后,作为示例,我会像这样使用这个哈希函数对象,

std::unordered_map<std::tuple<int,int,int>, std::size_t, tuple_hash> agg_map;
agg_map.insert(std::make_pair(std::make_tuple(1,2,3), 0U));
agg_map.insert(std::make_pair(std::make_tuple(4,5,6), 1U));

然而,在这两个GCC 6.1.0MSVC2015 ,我收到以下错误(上面每个违规行都相同):

error: invalid use of incomplete type 'class std::tuple_element<2ul, const std::tuple<int,int,int>&>'

我不完全确定是什么导致了这个错误(虽然它可能是由于通过模板参数 std::tuple 传递 Tuple 的“抽象”)或者如何解决它,所以任何帮助表示赞赏。

最佳答案

对于如下声明的参数:

const Tuple& t

decltype(t)产量:

const Tuple&

类似地,对于声明为的参数:

const std::pair<Ty1, Ty2>& t

decltype(t)产量:

const std::pair<Ty1, Ty2>&

在这两种情况下,生成的类型都是对类元组类型的引用。然而, std::tuple_element 不专门用于引用,这意味着编译器回退到主要的未定义类模板:

template <size_t I, typename T> class tuple_element;

你想要的,是一个普通的Tuple在前一种情况下,std::pair<Ty1, Ty2>在后一种情况下。

关于c++ - 使用 std::tuple_element 时无效使用不完整类型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39255604/

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