繁体   English   中英

如何在模板类中使用结构体作为成员

[英]How to use a struct as member in a template class

我正在尝试编写一个邻接列表来保存图形。
这是我的代码,类Graph有一个名为Node的成员。 Node可以保存任何类型的消息,以及许多子Node的开销。
Node thers 之后是一个nodes成员,用于保存图中的所有节点。

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

已读

使用 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>();
    }
};

按照n-pronouns-m 的建议,替换typename std::vector<Graph<T>::Node::Ptr> nodes; 使用std::vector<typename Graph<T>::Node::Ptr> nodes;

问题是在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毫无意义。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM