首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >递归别名模板

递归别名模板
EN

Stack Overflow用户
提问于 2018-07-01 20:38:01
回答 1查看 568关注 0票数 0

我正在创建一个邻接表来建模一个面向的加权图,我想知道递归别名模板是否可行。我试过这样的东西

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-01 21:58:11

在您的定义中,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;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51123368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档