C++ 无序映射有一个错误,表示函数本身不';t存在于库C+中+;

C++ 无序映射有一个错误,表示函数本身不';t存在于库C+中+;,c++,unordered-map,C++,Unordered Map,我是一名从事电子游戏开发的大二学生。我的老师甚至不知道如何解决这个问题,所以我希望这里有人能帮忙!提前谢谢你 我正在开发一款电子游戏,我需要为敌人寻找路径。我需要使用*寻路 我决定使用无序地图,因为我觉得这样更有效。我做了所有的代码,看起来都是对的,但是我从无序的地图库中得到了一个错误: Error C2280 'std::hash::hash(const std::hash &)': attempting to reference a deleted function.

我是一名从事电子游戏开发的大二学生。我的老师甚至不知道如何解决这个问题,所以我希望这里有人能帮忙!提前谢谢你

我正在开发一款电子游戏,我需要为敌人寻找路径。我需要使用*寻路

我决定使用无序地图,因为我觉得这样更有效。我做了所有的代码,看起来都是对的,但是我从无序的地图库中得到了一个错误:

Error C2280 'std::hash::hash(const std::hash &)': attempting to reference a deleted function. with [ _Kty=iPoint ] Game C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\unordered_map 117 错误C2280'std::hash::hash(const std::hash&'):尝试引用已删除的函数。 具有 [ _Kty=iPoint ]游戏C:\ProgramFiles(x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\unordered\U map 117 然后,此错误会将我带到无序的_映射文件,特别是这一行:

unordered_map() : _Mybase(_Key_compare(), allocator_type()) { // construct empty map from defaults } 无序映射():\u Mybase(\u Key\u compare(),allocator\u type()){//从默认值构造空映射 }

我的老师说这很奇怪,无法修复。另一件事是,我决定使用无序的地图,但这不是老师告诉我们的方式。他不反对我用不同的方法来做,但这也意味着我没有其他同学的参考,因为他们使用不同的方法(用列表做所有事情)

我将把我编码的寻路类放在这里:

这是寻路。h:

\ifndef\uu寻路__
#定义路径查找__
#包括“模块h”
#包括“h点”
#包括“DynArray.h”
#包括“List.h”
#包括
#包括
类寻路:公共模块
{
公众:
寻路();
~PathFinding();
int启发式(iPoint,iPoint);
iPoint路径(iPoint,int);
iPoint NextMove(标准:无序地图,iPoint,iPoint);
};
#endif/\uu寻路\u H__
这是PathFinding.cpp:

#包括“App.h”
#包括“寻路.h”
#包括“Player.h”
#包括“List.h”
#包括
#包括
#包括“Defs.h”
#包括“Log.h”
寻路::寻路():模块(){name.Create(“寻路”);}
寻路::~PathFinding(){}
int寻路::启发式(iPoint开始,iPoint结束)
{
返回abs(start.x-end.x)+abs(start.y-end.y);
}
列出邻居(I点电流、I点速度)
{
List=List();
//顺序是上、右、下、左
添加(iPoint(current.x,current.y-speed));
添加(iPoint(当前.x+速度,当前.y));
添加(iPoint(current.x,current.y-speed));
添加(iPoint(current.x-speed,current.y));
退货清单;
}
iPoint寻路::下一个移动(标准::无序映射从,iPoint结束,iPoint开始)
{
i点电流=结束;
while(从[当前]!=开始)
{
当前=来自[当前];
}
回流;
}
iPoint寻路::路径(iPoint开始,int速度)
{   
优先队列边界;
std::无序的地图来自;
std::无序映射到目前为止的成本;
边界。放置(开始,0);
iPoint end=app->player->playerPos;
来自[开始]=开始;
成本迄今为止[开始]=0;
而(!frontier.empty())
{
iPoint current=frontier.get();
如果(当前==结束)
{
打破
}
列表邻居=邻居(当前、速度);
对于(int i=0;i<4;i++)
{
双倍新成本=迄今成本[当前]+速度;
iPoint next=邻居。At(i)->数据;
if(cost_so_far.find(next)=cost_so_far.end()| | new_cost

这是VisualStudio中的C++。如果有人能帮忙,我会非常感激!再次感谢你

请参见John Zwinck对此的回答


基本上,无序映射的键(一个
iPoint
)需要是“可散列的”。因此,您需要为它实现一个哈希函数,但我不知道具体如何实现。

如果问题在别处得到了回答,请将问题标记为重复,而不是重复答案。@AlgirdasPreidžius谢谢,您是对的。我刚问过。这回答了你的问题吗?这并没有解决这个问题,但是包含两个连续下划线(
\uuuuu寻路\u H\uuuuu
)的名称以及以下划线开头并后跟大写字母的名称保留供实现使用。不要在你的代码中使用它们。潜在的重复点更集中在
向量的散列上,但无论如何:你需要为
iPoint
编写一个散列函数,它可以合理地使用,例如
名称空间std{template struct hash{auto operator()(const-iPoint&point)const{return point.x+(point.y>2);};}
。您可以将
#ifndef/#define/#endif
替换为
#pragma一次
,以避免Pete提到的上述问题。请尽早更换您的老师。对于任何使用C++11的人来说,
std::hash
需要为自定义结构“实现”这一事实应该不是新闻,更不用说“非常奇怪”。谢谢大家!我为iPoint添加了hash函数,它可以工作!