递归别名模板
Recursive alias template
我正在创建一个邻接表来对 面向加权图 进行建模,我想知道是否 递归别名模板 是可能的。
我试过这样的东西
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
来避免这个问题,但它看起来有点 'dangerous',即使我知道我在做什么。
你有什么 suggestions/ideas 可以解决这个问题吗?
编辑 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's solution, which was very relevant, and 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;
};
我会将问题标记为已解决,非常感谢您的宝贵时间和帮助:)
在您的定义中,graph_test
缺少模板参数,并且缺少 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;
};
我正在创建一个邻接表来对 面向加权图 进行建模,我想知道是否 递归别名模板 是可能的。 我试过这样的东西
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
来避免这个问题,但它看起来有点 'dangerous',即使我知道我在做什么。
你有什么 suggestions/ideas 可以解决这个问题吗?
编辑 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's solution, which was very relevant, and 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;
};
我会将问题标记为已解决,非常感谢您的宝贵时间和帮助:)
在您的定义中,graph_test
缺少模板参数,并且缺少 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;
};