сделать второй аргумент std :: pair пользовательским классом - PullRequest
0 голосов
/ 02 мая 2020

Я реализую класс Node в C ++ как присваивание.

Класс:

#pragma once
#include <iostream>

class Node {
    size_t id;
    std::pair<size_t, Node> dist;
public:
    //Node();
    //Node(const size_t);
    Node(const size_t, const std::pair<size_t, Node>);
    Node(const Node&);
    //std::pair<const bool, const std::string> setId(size_t);
    //std::pair<const bool, const std::string> setDist(std::pair<size_t, Node>);
    //void operator=(const Node&);
};


Node::Node(const size_t nodeId, const std::pair<size_t, Node> distanceFromPreviousNode) : id(nodeId), dist(distanceFromPreviousNode) { }


Node::Node(const Node& node) {
    try {
        id = node.id;
        dist = node.dist;
        throw std::string("Could not set the id and distance to given value");
    }
    catch (std::string exception) {
        std::cerr << exception;
        exit(1);
    }
}

Уверяю, что все функции были реализованы в файле node.cpp.

Тем не менее, я получаю следующую ошибку std::pair<size_t, Node>::second uses undefined class 'Node'

Я совершенно не понимаю, что ошибка хочет от меня, и почему intellisense не обнаруживает ее. О, также генерируется ctor (по крайней мере, это номер строки, на которую указывает сообщение об ошибке)

1 Ответ

2 голосов
/ 02 мая 2020
std::pair<size_t, Node> dist;

Для этого объявления члена требуется, чтобы Node был полностью определен в точке объявления, а это не так. Это то, что говорит вам ошибка.

Кроме того, то, что вы пытаетесь сделать, невозможно. Как должна выглядеть схема памяти экземпляра Node? Экземпляр Node имеет член dist, который сам имеет член типа Node, который имеет член dist и т. Д. c ... Это потребует бесконечной памяти.

Разрешено иметь Node* члена в Node, если это поможет.

...