递归别名模板

时间:2018-07-01 12:38:01

标签: c++ c++11 graph c++17 adjacency-list

我正在创建一个邻接列表以对面向加权的图进行建模,并且我想知道递归别名模板是否可行。 我已经尝试过这样的事情

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;
};

我将标记为已解决的问题,非常感谢您的时间和帮助:)

1 个答案:

答案 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}}