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&lt;int&gt; 的散列,但无论如何:您需要为iPoint 编写一个散列函数,这可以合理地为例如namespace std template &lt;&gt; struct hash&lt;iPoint&gt; auto operator()(const iPoint&amp; point) const return point.x + (point.y &lt;&lt; 6) + (point.y &gt;&gt; 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() 函数抛出段错误,我不知道为啥

当用户在 unordered_map 中自定义哈希函数时,无法解码 g++ 中的模糊编译器错误

将 unordered_map 分配给一对对象

map (vs) unordered_map 以对为键

unordered_map _begin 访问权限错误