C++ 如何将结构用作模板类中的成员
我正在尝试编写一个邻接列表以保存图表。C++ 如何将结构用作模板类中的成员,c++,class,templates,struct,C++,Class,Templates,Struct,我正在尝试编写一个邻接列表以保存图表。 这是我的代码,类Graph有一个名为Node的成员。节点可以保存任何类型的消息,也可以保存许多子消息,并为此付出代价。 在节点之后是一个节点成员,用于保存图形中的所有节点 模板 类图{ 公众: 结构节点{ 使用Ptr=std::shared\u Ptr; T值; 性病媒儿童; 节点(){} Node(T data):val(data),children(){} }; typename std::向量节点; 图(){} 图(大小n):节点(n){ 用于(自动
这是我的代码,类
Graph
有一个名为Node
的成员。节点
可以保存任何类型的消息,也可以保存许多子消息,并为此付出代价。在
节点
之后是一个节点
成员,用于保存图形中的所有节点
模板
类图{
公众:
结构节点{
使用Ptr=std::shared\u Ptr;
T值;
性病媒儿童;
节点(){}
Node(T data):val(data),children(){}
};
typename std::向量节点;
图(){}
图(大小n):节点(n){
用于(自动节点:节点)
node=std::使_共享();
}
};
问题typename std::vector节点代码>
我的编译器认为Ptr
不是有效的类型,下面是错误
type/value mismatch at argument 1 in template parameter list for ‘template<class _Tp, class _Alloc> class std::vector’
“template class std::vector”的模板参数列表中参数1的类型/值不匹配
我可以将节点
的声明放在图
之外,并将其作为解决此问题的模板,但为什么不能呢
系统信息
- Ubuntu 20.04(WSL2)
- g++(Ubuntu 9.3.0-10ubuntu2)9.3.0
typename std::vector节点代码>带有std::vector节点代码>使用共享\u ptr替换使用ptr=std::共享\u 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>();
}
};
模板
类图{
公众:
结构节点{
T值;
性病媒儿童;
节点(){}
Node(T data):val(data),children(){}
};
typename std::向量节点;
图(){}
图(大小n):节点(n){
用于(自动节点:节点)
node=std::使_共享();
}
};
或
模板
类图{
公众:
结构节点{
使用Ptr=std::shared\u Ptr;
T值;
性病媒儿童;
节点(){}
Node(T data):val(data),children(){}
};
std::向量节点;
图(){}
图(大小n):节点(n){
用于(自动节点:节点)
node=std::使_共享();
}
};
问题在于,在std::vector
中,不知道Graph::Node::Ptr
是一种类型,因此假设它是一个值
这是需要typename
的部分,但由于它是在Graph
中定义的,因此不需要所有这些限定条件:
std::vector<typename Node::Ptr> nodes;
std::向量节点;
(请注意,typename std::vector vi;
是有效的,即使typename
是无意义的。)typename
位于错误的位置。试试std::vector
。旁白:auto node
是node::Ptr
的一个副本,而不是一个引用,因此所有节点
都将在构建完成后立即被销毁。旁白:为什么不在node::children
中包含std::vector节点
和非所有指针?在任何一种情况下,都必须清除指向从图形中删除的节点的指针。
std::vector<typename Node::Ptr> nodes;