Ошибка: нет соответствующей функции для вызова 'std::map<std:: __ cxx11:: basic_string <char>

Я пытаюсь удалить узел для общего ориентированного взвешенного графа. Когда я удаляю узел, мне также нужно удалить входящие и исходящие ребра этого узла, поэтому я не могу просто удалить узел, но также должен удалить ребра, которые прикреплены к другим узлам, которые раньше связывались с этим узлом до него. удален

Для функции я пытаюсь найти связывающий узел с помощью функции find(), которая используется для поиска узла в node_, который объявлен как:

std::map< N, std::shared_ptr<Node> > nodes_;

Я пробовал originNodeOfIncomingEdge->dge_.erase(edge); но это не работает, поэтому я пытаюсь сделать следующее, чтобы найти узел на карте узлов_, прежде чем выполнять удаление.

auto findLinkingNode1 = nodes_.find(originNodeOfIncomingEdge);

Тем не менее, я продолжаю получать следующую ошибку, не уверен, что не так.

tests/Graph.tem:558:64: error: no matching function for call to ‘std::map<std::__cxx11::basic_string<char>, std::shared_ptr<gdwg::Graph<std::__cxx11::basic_string<char>, int>::Node>, std::less<std::__cxx11::basic_string<char> >, std::allocator<std::pair<const std::__cxx11::basic_string<char>, std::shared_ptr<gdwg::Graph<std::__cxx11::basic_string<char>, int>::Node> > > >::find(std::shared_ptr<gdwg::Graph<std::__cxx11::basic_string<char>, int>::Node>&)’
    auto findLinkingNode1 = nodes_.find(originNodeOfIncomingEdge);
                                                                ^
In file included from /usr/local/include/c++/6.1.0/map:61:0,
                 from tests/Graph.h:19,
                 from tests/test8c.cpp:3:
/usr/local/include/c++/6.1.0/bits/stl_map.h:1079:7: note: candidate: std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::find(const key_type&) [with _Key = std::__cxx11::basic_string<char>; _Tp = std::shared_ptr<gdwg::Graph<std::__cxx11::basic_string<char>, int>::Node>; _Compare = std::less<std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, std::shared_ptr<gdwg::Graph<std::__cxx11::basic_string<char>, int>::Node> > >; std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, std::shared_ptr<gdwg::Graph<std::__cxx11::basic_string<char>, int>::Node> > >; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::__cxx11::basic_string<char>]
       find(const key_type& __x)
       ^~~~

Это код для удаления узла.

template <typename N, typename E>
void Graph<N, E>::deleteNode(const N& node) noexcept {
    auto findNode = nodes_.find(node);
    if (findNode != nodes_.end()) {

        for (auto edge: findNode->second->incomingEdges_) {

            // find the node which has incoming edges into the deleted node
            auto originNodeOfIncomingEdge = edge->dest.lock(); // origin node of incoming edge to deleted node

            auto nodeVal = originNodeOfIncomingEdge->val_;
            std::cout << "Print out value of origin node of incoming edge to deleted node: " << nodeVal << std::endl;


            // delete the edge from the node
            //originNodeOfIncomingEdge->edges_.erase(edge);


            auto findLinkingNode1 = nodes_.find(originNodeOfIncomingEdge);
            if (findLinkingNode1 == nodes_.end()) throw std::runtime_error("deleteNode: findLinkingNode1 DNE");

        }

        findNode->second.reset(); // deletes managed object of the shared_ptr
        nodes_.erase(findNode); // removes the node from the map container


    }
}

Ниже приведены некоторые объявления моего класса Graph:

template <typename N, typename E> class Graph {

    private:
        struct Node;
        struct Edge;

        struct Node {
            N val_;
            int numEdges_;
            int numIncomingEdges_;
            std::set<std::shared_ptr<Edge>> edges_;
            std::set<std::shared_ptr<Edge>> incomingEdges_;
            Node() {}
            Node(const N x) : val_{x} { numEdges_=0; }
            void printNode(N n);
            ~Node();
            void update();
        };

        struct Edge {
            std::weak_ptr<Node> orig;
            std::weak_ptr<Node> dest;
            E val_;
            Edge(std::shared_ptr<Node> o, std::shared_ptr<Node> d, E x);
            Edge() {};
            void printEdge();
            ~Edge();
        };

2 ответа

Решение

Ошибка говорит о том, что originNodeOfIncomingEdge имеет тип std::shared_ptr<gdwg::Graph<std::__cxx11::basic_string<char>‌​, int>::Node> вместо std::string

Я считаю, что это то, что вы хотите:

auto findLinkingNode1 = nodes_.find(nodeVal);
if (findLinkingNode1 == nodes_.end())
   // logic to handle

Здесь компилятор говорит, что карта создается с ключом типа std::string, а вы вызываете find с ключом типа Node. Ты можешь попробовать auto findLinkingNode1 = nodes_.find(originNodeOfIncomingEdge->val_);? Лучше, если вы поделитесь вызовом вашего void Graph<N, E>::deleteNode(const N& node) noexcept и или создание объекта Graph.

Другие вопросы по тегам