0

我正在尝试编写一个邻接列表来保存图形。
这是我的代码,该类Graph有一个名为Node. 可以保存任何类型的Node消息,并为他们节省许多孩子的费用。
之后Nodenodes成员将所有节点保存在图中。

template<typename T>
class Graph {
public:
    struct Node {
        using Ptr = std::shared_ptr<Node>;
        T val;
        std::vector<std::pair<Ptr, int>> children;
        Node() {}
        Node(T data) : val(data) , children() {}
    };

    typename std::vector<Graph<T>::Node::Ptr> nodes;
    Graph(){}
    Graph(size_t n) : nodes(n) {
        for(auto node : nodes)
            node = std::make_shared<Node>();
    }
};

问题
typename std::vector<Graph<T>::Node::Ptr> nodes;
我的编译器认为Ptr不是有效类型,这是错误

type/value mismatch at argument 1 in template parameter list for ‘template<class _Tp, class _Alloc> class std::vector’

我可以把声明放在Node外面,Graph做成一个模板来解决这个问题,但是为什么不能呢?

系统信息

  • Ubuntu 20.04 (WSL2)
  • g++ (Ubuntu 9.3.0-10ubuntu2) 9.3.0

已阅读

4

3 回答 3

1

使用 shared_ptr 替换 using Ptr = std::shared_ptr;

template<typename T>
class Graph {
public:

    struct Node {
        T val;
        std::vector<std::pair<std::shared_ptr<Node>, int>> children;
        Node() {}
        Node(T data) : val(data), children() {}
    };

    typename std::vector<std::shared_ptr<Node>> nodes;

    Graph() {}
    Graph(size_t n) : nodes(n) {
        for (auto node : nodes)
            node = std::make_shared<Node>();
    }
};

或者

template<typename T>
class Graph {
public:
    struct Node {
        using Ptr = std::shared_ptr<Node>;

        T val;
        std::vector<std::pair<Ptr, int>> children;
        Node() {}
        Node(T data) : val(data), children() {}
    };
    std::vector<typename Graph<T>::Node::Ptr> nodes;
    Graph() {}
    Graph(size_t n) : nodes(n) {
        for (auto node : nodes)
            node = std::make_shared<Node>();
    }
};

于 2020-09-08T07:54:43.343 回答
0

正如n-pronouns-m所建议的那样,替换typename std::vector<Graph<T>::Node::Ptr> nodes;std::vector<typename Graph<T>::Node::Ptr> nodes;

于 2020-09-08T07:44:43.400 回答
0

问题是在 中std::vector<Graph<T>::Node::Ptr>,它是一个类型是未知Graph<T>::Node::Ptr的,所以假设它是一个值。

那是需要的部分typename,但由于它是在 内定义的Graph<T>,因此您不需要所有这些资格:

std::vector<typename Node::Ptr> nodes;

(请注意,typename std::vector<int> vi;即使typename没有意义,它也是有效的。)

于 2020-09-08T08:07:58.583 回答