RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 858442
Accepted
isnullxbh
isnullxbh
Asked:2020-07-21 19:40:41 +0000 UTC2020-07-21 19:40:41 +0000 UTC 2020-07-21 19:40:41 +0000 UTC

模板类中的类型别名

  • 772

例子:

#include <utility>       // std::pair
#include "vertex.hpp"    // IVertex class 

template <typename Key>
class IEdge {
public:
    using   VertexPtr = IVertex<Key>*;
    using Endvertices = std::pair<VertexPtr, VertexPtr>;
// ...
public:
    Endvertices& endvertices() noexcept = 0;    
};

template <typename Key = int>
class Edge : public IEdge<Key> {
public:
    // interface: IEdge
    Endvertices& endvertices() noexcept override;
};

编译器会生成大量与缺少关键字相关的错误typename,添加后者也无济于事。

问:怎么处理?我是否应该在每个别名前面加上带有当前模板参数的基类,例如:

typename IEdge<Key>::Envertices 

如果是这样,请解释为什么在使用模板的情况下这是必要的。

c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    user7860670
    2020-07-21T20:17:33Z2020-07-21T20:17:33Z

    是的,在子类中,当引用基类的类型时,必须以类名和 为前缀typename。关键是在实例化模板之前,IEdge基模板类中某些组件的存在是未知的(因为它们可能会因参数而异Key)并且编译器无法确定标识符的来源Endvertices。

    • 3
  2. AnT stands with Russia
    2020-07-22T00:27:11Z2020-07-22T00:27:11Z

    您在这里混合了两个独立的问题。

    首先,typename它们与此代码中没有错误无关。此代码中的错误是由于在基类是依赖类型的情况下,正常的非限定名称搜索不会查找该基类。Endvertices因此,似乎找不到派生类中使用的非限定名称。(例如,参见Class Hierarchy 2 中的错误)

    typename这里没有什么。难怪添加typename没有帮助。

    其次,如果我们谈论的是基类的字段或方法,问题可以通过通过访问this->...或通过限定名称访问来解决IEdge<Key>::...。对于类型名称,只有第二个选项适用。由于类型IEdge<Key>是依赖的,这就是规则生效的地方,需要typename引用嵌套类型。(例如,参见C++ 错误相关名称不是类型,前缀为 'typename' 表示类型)

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5