Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将结构用作模板类中的成员_C++_Class_Templates_Struct - Fatal编程技术网

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;