gpt4 book ai didi

c++ - 无法创建 tuple 的 unordered_map

转载 作者:太空狗 更新时间:2023-10-29 23:53:35 25 4
gpt4 key购买 nike

我正在使用 std::unordered_map<std::tuple<int, int, int>, float> .但是VS2010不会编译实例化。我明确提供了 hash特化和operator==重载。报错信息是指

std::unordered_map<NodeType, float> g_score;

这里是错误的全文:

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\tuple(127): error C2440: 'initializing' : cannot convert from 'const NodeType' to 'int'
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxtuple0(9) : see reference to function template instantiation 'std::tr1::_Cons_node<_Car,_Cdr>::_Cons_node<_Ty,std::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&>(_Farg0 &&,_Farg1,_Farg2,_Farg3,_Farg4,_Farg5,_Farg6,_Farg7,_Farg8,_Farg9)' being compiled
1> with
1> [
1> _Car=int,
1> _Cdr=std::tr1::_Cons_node<int,std::tr1::_Cons_node<int,std::tr1::_Tuple_type<std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>::_Type>>,
1> _Ty=NodeType,
1> _Farg0=NodeType,
1> _Farg1=std::tr1::_Nil &,
1> _Farg2=std::tr1::_Nil &,
1> _Farg3=std::tr1::_Nil &,
1> _Farg4=std::tr1::_Nil &,
1> _Farg5=std::tr1::_Nil &,
1> _Farg6=std::tr1::_Nil &,
1> _Farg7=std::tr1::_Nil &,
1> _Farg8=std::tr1::_Nil &,
1> _Farg9=std::tr1::_Nil &
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(145) : see reference to function template instantiation 'std::tr1::tuple<_Arg0,_Arg1,_Arg2>::tuple<const std::tr1::tuple<_Arg0,_Arg1,_Arg2>>(_Farg0 &&)' being compiled
1> with
1> [
1> _Arg0=int,
1> _Arg1=int,
1> _Arg2=int,
1> _Farg0=const std::tr1::tuple<int,int,int>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(142) : while compiling class template member function 'std::_Pair_base<_Ty1,_Ty2>::_Pair_base(const std::tr1::tuple<_Arg0,_Arg1,_Arg2> &&,float &&)'
1> with
1> [
1> _Ty1=const NodeType,
1> _Ty2=float,
1> _Arg0=int,
1> _Arg1=int,
1> _Arg2=int
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(174) : see reference to class template instantiation 'std::_Pair_base<_Ty1,_Ty2>' being compiled
1> with
1> [
1> _Ty1=const NodeType,
1> _Ty2=float
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\unordered_map(279) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
1> with
1> [
1> _Ty1=const NodeType,
1> _Ty2=float
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\unordered_map(275) : while compiling class template member function 'float &std::tr1::unordered_map<_Kty,_Ty>::operator [](const std::tr1::tuple<_Arg0,_Arg1,_Arg2> &)'
1> with
1> [
1> _Kty=NodeType,
1> _Ty=float,
1> _Arg0=int,
1> _Arg1=int,
1> _Arg2=int
1> ]
1> c:\repo\render\render\sim\simcontext.cpp(155) : see reference to class template instantiation 'std::tr1::unordered_map<_Kty,_Ty>' being compiled
1> with
1> [
1> _Kty=NodeType,
1> _Ty=float
1> ]
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\tuple(127): error C2439: 'std::tr1::_Cons_node<_Car,_Cdr>::_Value' : member could not be initialized
1> with
1> [
1> _Car=int,
1> _Cdr=std::tr1::_Cons_node<int,std::tr1::_Cons_node<int,std::tr1::_Tuple_type<std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>::_Type>>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\tuple(170) : see declaration of 'std::tr1::_Cons_node<_Car,_Cdr>::_Value'
1> with
1> [
1> _Car=int,
1> _Cdr=std::tr1::_Cons_node<int,std::tr1::_Cons_node<int,std::tr1::_Tuple_type<std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>::_Type>>
1> ]

不确定从哪里开始,因为我以前从未见过这个错误。有什么建议吗?

编辑:有趣的是,unordered_set<NodeType>就在编译干净之前。

为 SSCCE 尝试这个:

#include <deque>
#include <tuple>
#include <unordered_map>
#include <unordered_set>

void GetPath() {
typedef std::tuple<int, int, int> NodeType;
struct node_hasher : public std::unary_function<const NodeType&, std::size_t> {
std::size_t operator()(const NodeType& node) const {
return std::hash<int>()(std::get<0>(node) + std::get<0>(node) + std::get<0>(node) + std::get<1>(node) + std::get<1>(node) + std::get<2>(node));
}
};
std::unordered_set<NodeType, node_hasher> closed_set;
std::unordered_map<NodeType, float, node_hasher> g_score;
std::unordered_map<NodeType, float, node_hasher> f_score;
std::unordered_map<NodeType, NodeType, node_hasher> came_from;
auto node_comparator = [&](NodeType lhs, NodeType rhs) {
return f_score[lhs] < f_score[rhs];
};
}

int main() {
}

在空项目中编译失败并出现同样的错误。如果您取消注释 node_comparator lambda,它工作得很好。难怪我遇到了麻烦 - 这是另一个 VS 错误。

最佳答案

这是 Visual C++ 2010 标准库中的错误。请参阅以下有关 Microsoft Connect 的报告:

C++ map<tuple<...>, V> compilation problems

该错误已针对 Visual Studio 11 修复。您的示例使用 Visual Studio 11 Beta 编译时没有错误。

关于c++ - 无法创建 tuple<int, int, int> 的 unordered_map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10238432/

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