[英]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
,做成一个模板来解决这个问题,但是为什么不能呢?
系统信息
已读
使用 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.