Unordered map 有一个错误,指出函数本身在库 C++ 中不存在
Posted
技术标签:
【中文标题】Unordered map 有一个错误,指出函数本身在库 C++ 中不存在【英文标题】:Unordered map has an error that says that the function itself doesn't exist in the library C++ 【发布时间】:2020-11-30 12:33:24 【问题描述】:我是电子游戏开发专业的大二学生。我的老师甚至不知道如何解决这个问题,所以我希望这里有人可以提供帮助!提前谢谢!
我正在开发一款电子游戏,我需要为敌人寻找路径。我需要使用 A* 寻路。
我决定使用无序地图,因为我认为它更有效。我做了所有的代码,它似乎是正确的,但后来我从 unordered_map 库中得到一个错误:
错误 C2280 'std::hash::hash(const std::hash &)':试图引用已删除的函数。 和 [ _Kty=iPoint ] 游戏 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\unordered_map 117
然后这个错误将我带到 unordered_map 文件,特别是这一行:
unordered_map() : _Mybase(_Key_compare(), allocator_type()) // 从默认值构造空映射
我的老师说这很奇怪,无法解决。另一件事是我决定使用 unordered_maps 但这不是老师告诉我们这样做的方式。他对我做不同的事情没有问题,但这也意味着我没有其他同学的其他参考,因为他们使用了不同的方法(用列表做所有事情)。
我将把我编写的寻路类放在这里:
这是 PathFinding.h:
#ifndef __PATHFINDING_H__
#define __PATHFINDING_H__
#include "Module.h"
#include "Point.h"
#include "DynArray.h"
#include "List.h"
#include <unordered_map>
#include <queue>
class PathFinding : public Module
public:
PathFinding();
~PathFinding();
int Heuristic(iPoint, iPoint);
iPoint Path(iPoint, int);
iPoint NextMove(std::unordered_map<iPoint, iPoint>, iPoint, iPoint);
;
#endif // __PATHFINDING_H__
这是 PathFinding.cpp:
#include "App.h"
#include "PathFinding.h"
#include "Player.h"
#include "List.h"
#include <unordered_map>
#include <queue>
#include "Defs.h"
#include "Log.h"
PathFinding::PathFinding() : Module() name.Create("pathfinding");
PathFinding::~PathFinding()
int PathFinding::Heuristic(iPoint start, iPoint end)
return abs(start.x - end.x) + abs(start.y - end.y);
List<iPoint> Neighbours(iPoint current, int speed)
List<iPoint> list = List<iPoint>();
// Order is top, right, bottom, left
list.Add(iPoint(current.x, current.y - speed));
list.Add(iPoint(current.x + speed, current.y));
list.Add(iPoint(current.x, current.y - speed));
list.Add(iPoint(current.x - speed, current.y));
return list;
iPoint PathFinding::NextMove(std::unordered_map<iPoint, iPoint> cameFrom, iPoint end, iPoint start)
iPoint current = end;
while (cameFrom[current] != start)
current = cameFrom[current];
return current;
iPoint PathFinding::Path(iPoint start, int speed)
PriorityQueue<iPoint, double> frontier;
std::unordered_map<iPoint, iPoint> came_from;
std::unordered_map<iPoint, int> cost_so_far;
frontier.put(start, 0);
iPoint end = app->player->playerPos;
came_from[start] = start;
cost_so_far[start] = 0;
while (!frontier.empty())
iPoint current = frontier.get();
if (current == end)
break;
List<iPoint> neighbours = Neighbours(current, speed);
for (int i = 0; i < 4; i++)
double new_cost = cost_so_far[current] + speed;
iPoint next = neighbours.At(i)->data;
if (cost_so_far.find(next) == cost_so_far.end() || new_cost < cost_so_far[next])
cost_so_far[next] = new_cost;
double priority = new_cost + Heuristic(next, end);
frontier.put(next, priority);
came_from[next] = current;
return NextMove(came_from, end, start);
这是 Visual Studio 中的 C++。如果有人可以提供帮助,我将不胜感激!再次感谢!
【问题讨论】:
这能回答你的问题吗? Compilation error related to map and unordered_map: "attempting to reference a deleted function" 这并没有解决问题,但是包含两个连续下划线 (__PATHFINDING_H__
) 的名称以及以下划线后跟一个大写字母的名称保留供实现使用。不要在你的代码中使用它们。
潜在的重复更侧重于vector<int>
的散列,但无论如何:您需要为iPoint
编写一个散列函数,这可以合理地为例如namespace std template <> struct hash<iPoint> auto operator()(const iPoint& point) const return point.x + (point.y << 6) + (point.y >> 2); ;
。您可以将 #ifndef/#define/#endif
替换为 #pragma once
并避免上面提到的问题。
尽早更换老师。 std::hash
需要为自定义结构“实现”这一事实对于任何使用 C++11 的人来说都不应该是新闻,更不用说“非常奇怪”了。
谢谢大家!我为 iPoint 添加了哈希函数,它可以工作了!
【参考方案1】:
在other question 上查看 John Zwinck 的回答。
基本上,您的 unordered_map 的键(iPoint
)必须是“可散列的”。所以你需要为它实现一个哈希函数,但我不知道你是怎么做的。
【讨论】:
如果问题在别处得到回答 - 将问题标记为重复,而不是重复答案。 @AlgirdasPreidžius 谢谢,你是对的。我刚做了。以上是关于Unordered map 有一个错误,指出函数本身在库 C++ 中不存在的主要内容,如果未能解决你的问题,请参考以下文章
std::unordered_map 不断导致错误,这是一个错误吗?
C++ unordered_map emplace() 函数抛出段错误,我不知道为啥