C++ Предпринята попытка ссылки на удаленную функцию. Visual Studio 2017

326
14 марта 2018, 06:29

SquareGrid.h

#pragma once
#ifndef SQUARE_GRID_H
#define  SQUARE_GRID_H
#include <set>
#include <array>
#include <vector>
#include <unordered_map>
#include <queue>
struct SPODGridPosition
{
    int x;
    int y;
};
bool operator < (const SPODGridPosition & x1, const SPODGridPosition & x2);
bool operator == (const SPODGridPosition & x1, const SPODGridPosition & x2);
bool operator != (const SPODGridPosition & x1, const SPODGridPosition & x2);
struct SSquareGrid
{
    typedef  SPODGridPosition Location;
    static std::array<Location, 4> m_dirs;
    std::set<Location> m_wallsSet;
    SSquareGrid(int width, int height)
        : m_width(width)
        , m_height(height)
    {
    }
    void AddOrDeleteWall(int x, int y)
    {
        Location next{ x,y };
        auto iter = m_wallsSet.find(next);
        if ( iter != m_wallsSet.end())
        {
            m_wallsSet.erase(iter);
        }
        m_wallsSet.insert(next);
    }
    bool InBounds(const Location & id) const
    {
        return 0 < id.x && id.x < m_width && 0 < id.y && id.y < m_height;
    }
    bool Passable(const Location & id) const
    {
        return m_wallsSet.find(id) != m_wallsSet.end();
    }
    std::vector<Location> Neighbors(Location id) const
    {
        std::vector<Location> result;
        for (auto const dir : m_dirs)
        {
            Location next{ id.x + dir.x, id.y + dir.y };
            if (InBounds(next) && Passable(next))
            {
                result.push_back(next);
            }
        }
        return result;
    }
    int m_width;
    int m_height;
};
extern SSquareGrid g_SquareGrid;
#endif // !SQUARE_GRID_H

SquarGrid.cpp

#include "SquareGrid.h"
SSquareGrid g_SSquareGrid(30, 30);
bool operator < (const SPODGridPosition & x1, const SPODGridPosition & x2)
{
    return std::tie(x1.x, x1.y) < std::tie(x2.x, x2.y);
}
bool operator == (const SPODGridPosition & x1, const SPODGridPosition & x2)
{
    return x1.x == x2.x && x1.y == x2.y;
}
bool operator != (const SPODGridPosition & x1, const SPODGridPosition & x2)
{
    return !(x1 == x2);
}

FindPath.h

#pragma once
#include "SquareGrid.h"
template <typename Graph, typename Location>
std::unordered_map<Location, Location> BreadthFirstSearch(const Graph & graph, Location start, Location goal);
void FindPath(int n32SelfX, int n32SelfY, int n32TargetX, int n32TargetY);

FindPath.cpp

#include "FindPath.h"
std::array<SPODGridPosition, 4> SSquareGrid::m_dirs = { SPODGridPosition{0,1},
SPODGridPosition{1,0}, SPODGridPosition{0,-1}, SPODGridPosition{-1,0} };
template <typename Graph, typename Location>
std::unordered_map<Location, Location>  BreadthFirstSearch(const Graph & graph, Location start, Location goal)
{
    std::queue<Location> frontier;
    frontier.push(start);
    std::unordered_map<Location, Location> came_from;
    came_from[start] = start;
    while (!frontier.empty())
    {
        auto current = frontier.front();
        frontier.pop();
        if (current == goal) break;
        for (auto & next : graph.Neighbors(current))
        {
            frontier.push(next);
            came_from[next] = current;
        }
    }
    return came_from;
}
void FindPath(int n32SelfX, int n32SelfY, int n32TargetX, int n32TargetY)
{
    auto came_from = BreadthFirstSearch(g_SquareGrid, SPODGridPosition{ n32SelfX, n32SelfY },
        SPODGridPosition{ n32TargetX, n32TargetY });
}

Ошибка : C2280 "std::hash<_Kty>::hash(const std::hash<_Kty> &)": предпринята попытка ссылки на удаленную функцию MyGame c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.13.26128\include\unordered_map 132

Замечание : Если содержимое FindPath удалить, то компилируется.

Answer 1

Вы не определили hasher для своего SPODGridPosition. В результате компилятор подхватывает какую-то свою специализацию std::hash<SPODGridPosition> для стандартного std::hash<>. А в ней удален конструктор копирования, что и приводит к ошибке где-то в недрах конструкции unordered_map.

Это в любом случае не могло работать, ибо как надо хэшить ваш SPODGridPosition компилятор не знает. Определите hasher для SPODGridPosition и укажите его в качестве третьего параметра шаблона unordered_map.

READ ALSO
Как обрабатывать labels в C++ (CLR)

Как обрабатывать labels в C++ (CLR)

Доброе время сутокТребуется изменять значения каждого Label`a через N время, каким образом можно организовать систему обращения к данным полям...

199
Вопрос по синтаксису использования make_uniuque

Вопрос по синтаксису использования make_uniuque

Подскажите, пожалуйста, как синтаксически верно переделать эту строчку:

185
CLASSPATH не видит классы

CLASSPATH не видит классы

Читаю книгу Философия Java, нужно подключить классы автора через CLASSPATH, но ничего не выходит и честно, не знаю в чём может быть проблемаВроде...

187
Реализация Smooth sort на Java

Реализация Smooth sort на Java

Где можно найти реализацию Smooth sort на Java? Нашел на Гит Хабе реализацию, но не сортируетВот сам код https://github

394