试图引用已删除的功能(未引用功能)

时间:2019-01-19 21:04:26

标签: c++ function reference

在我显然Attempting to reference a deleted function的那一刻,我遇到了问题。据我所知,我实际上不是在引用函数,而是指向结构的智能指针。

这是一个大学项目,其中使用了多个头文件和CPP文件,使我们能够了解如何在同一项目中使用多个文件,并将它们链接在一起,同时了解并利用多态性。我们使用多个文件作为我们必须的简要说明。文件和定义是为我们提供的。

以下内容应该在从起始位置到目标位置的地形图(范围为0到3的数字阵列)上进行“广度优先”搜索。这是关于寻路的。

这是我到目前为止所拥有的:

#include "SearchBreadthfirst.h" // Declaration of this class
#include <iostream>
#include <list>
using namespace std;

bool CSearchBreadthFirst::FindPath(TerrainMap& terrain, unique_ptr<SNode> start, unique_ptr<SNode> goal, NodeList& path)
{
    // Initialise Lists
    NodeList closedList;    // Closed list of nodes
    NodeList openList;      // Open list of nodes
    unique_ptr<SNode>currentNode(new SNode);    // Allows the current node to be stored
    unique_ptr<SNode>nextNode(new SNode);       // Allows the next nodes to be stored in the open list

    // Boolean Variables
    bool goalFound = false; // Returns true when the goal is found

    // Start Search
    openList.push_front(move(start)); // Push the start node onto the open list

    // If there is data in the open list and the goal hasn't ben found
    while (!openList.empty() || goalFound == false)
    {
        cout << endl << "Open list front:" << openList.front() << endl;
        currentNode->x = openList.front()->x;
        currentNode->y = openList.front()->y;
        currentNode->score = openList.front()->score;
        currentNode->parent = openList.front()->parent;
    }
}

突出显示此行:currentNode->x = openList.front()->x;是问题所在。

NodeList类型在SearchBreadthfirst.h中定义如下:

using NodeList = deque<unique_ptr<SNode>>;

SNodeSearchBreadthfirst.h中也这样定义:

struct SNode
{
  int x;             // x coordinate
  int y;             // y coordinate
  int score;         // used in more complex algorithms
  SNode* parent = 0; // note use of raw pointer here
};

程序在构建时中断。几天来,我一直在努力解决这个问题,因此,非常感谢您的帮助。如果我错过了任何内容,请告诉我,我将其添加!

詹姆斯

1 个答案:

答案 0 :(得分:3)

错误消息Attempting to reference a deleted function是由于std::unique_ptr明确delete是其副本构造函数的事实,因为显然,应该只包含它所包含的指针的一个副本。 / p>

致电时

openList.push_front(start);

您正在创建start类型的unique_ptr<SNode>副本,并且它具有已删除的副本构造函数。为了对容器使用std::unique_ptr,需要将对象移入容器。您需要执行以下操作:

openList.push_front(move(start));

这会将start移至deque,并将其中的内容移至start