我正在创建一个邻接列表以对面向加权的图进行建模,并且我想知道递归别名模板是否可行。 我已经尝试过这样的事情
template<class edge_data>
using graph_test = std::set<std::map<std::set<graph_test>::const_pointer, edge_data>>;
(集合的每个条目都是一个图,每个图代表一个顶点。每个图条目都是边:键是指向其他顶点的指针,值是权重。指针在插入时不会无效)
这会产生错误:'graph_test': undeclared identifier
。
我知道我可以使用std::any
来避免此问题,但是即使我知道我在做什么,它看起来还是有点“危险”。
您有什么建议/想法可以解决此问题吗?
编辑1: 正如Igor Tandetnik指出的那样,我创建我的 const_pointer 的方式可能不正确。我想出了这段代码(斜体修改):
template<class edge_data>
using graph_test = std::set<std::map<graph_test<edge_data>::const_pointer, edge_data>>;
问题和错误仍然存在,但至少已解决了一个错误。
编辑2:
我查看了bipll的解决方案,该解决方案非常相关,并查看了Dani的评论,表明可能缺少typedef
关键字。
我想出了这段代码,它可以编译:
template<class edge_data> struct graph_test
: std::set<typename std::map<typename graph_test<edge_data>::const_pointer, edge_data>> {
using std::map<typename graph_test<edge_data>::const_pointer, edge_data>::map;
};
我将标记为已解决的问题,非常感谢您的时间和帮助:)
答案 0 :(得分:0)
在您的定义中,typename
缺少模板参数,而template<class edge_data> struct graph_test
:std::set<
typename std::map<typename std::set<graph_test<edge_data>>::const_pointer, edge_data>>
{
using std::map<typename std::set<graph_test<edge_data>>::const_pointer, edge_data>>::map;
};
则缺失。此外,类型不能为其自身的别名,它的扩展将创建一个无限的依赖图。您可以将其设为实型,而不是别名:
{{1}}