实例化后模板的特化?

2024-01-10

我的完整代码太长,但这里有一个片段可以反映我的问题的本质:

class BPCFGParser {
  public:

  ...
  ...

  class Edge {
    ...
    ...
  };


  class ActiveEquivClass {
    ...
    ...
  };

  class PassiveEquivClass {
    ...
    ...
  };

  struct EqActiveEquivClass {
    ...
    ...
  };

  struct EqPassiveEquivClass {
    ...
    ...
  };



  unordered_map<ActiveEquivClass, Edge *, hash<ActiveEquivClass>, EqActiveEquivClass> discovered_active_edges;
  unordered_map<PassiveEquivClass, Edge *, hash<PassiveEquivClass>, EqPassiveEquivClass> discovered_passive_edges;

};

namespace std {


template <>
class hash<BPCFGParser::ActiveEquivClass>
{

    public:
        size_t operator()(const BPCFGParser::ActiveEquivClass & aec) const {

        }
};

template <>
class hash<BPCFGParser::PassiveEquivClass>
{

    public:
        size_t operator()(const BPCFGParser::PassiveEquivClass & pec) const {

        }
};

}

当我编译此代码时,出现以下错误:

In file included from BPCFGParser.cpp:3,
                 from experiments.cpp:2:
BPCFGParser.h:408: error: specialization of ‘std::hash<BPCFGParser::ActiveEquivClass>’     after instantiation
BPCFGParser.h:408: error: redefinition of ‘class                 std::hash<BPCFGParser::ActiveEquivClass>’
/usr/include/c++/4.3/tr1_impl/functional_hash.h:44: error: previous definition of     ‘class std::hash<BPCFGParser::ActiveEquivClass>’
BPCFGParser.h:445: error: specialization of     ‘std::hash<BPCFGParser::PassiveEquivClass>’ after instantiation
BPCFGParser.h:445: error: redefinition of ‘class std::hash<BPCFGParser::PassiveEquivClass>’
/usr/include/c++/4.3/tr1_impl/functional_hash.h:44: error: previous definition of     ‘class std::hash<BPCFGParser::PassiveEquivClass>’

现在我必须为这些类专门化 std::hash (因为标准 std::hash 定义不包括用户定义的类型)。当我将这些模板专业化移到类的定义之前时BPCFGParser,我在尝试过各种不同的事情时遇到了各种错误(http://www.parashift.com/c++-faq-lite/misc-technical-issues.html http://www.parashift.com/c++-faq-lite/misc-technical-issues.html)我读到:

Whenever you use a class as a template parameter, the declaration of that class must be complete and not simply forward declared.

所以我被困住了。之后我无法专门化模板BPCFGParser定义,我之前无法专门化它们BPCFGParser定义,我怎样才能让它工作?


您需要将专业化移至 BPCFGParser 内部的内部类中。这样做就满足了这两个要求。

非常感谢您的回答:)

hash类是在命名空间内定义的std。它不允许我专门化模板hash在非命名空间范围内。甚至以下:

template <>
  class std::hash<ActiveEquivClass> {
...

不工作。当我将专业括起来时namespace std {}然而,它给出了一个奇怪的错误:

In file included from BPCFGParser.cpp:3,
                 from experiments.cpp:2:
BPCFGParser.h:225: error: expected unqualified-id before ‘namespace’
experiments.cpp:7: error: expected `}' at end of input
BPCFGParser.h:222: error: expected unqualified-id at end of input

在给出的答案中速度评论 http://www.velocityreviews.com/forums/t672186-namespace-within-class.html,有人声称命名空间不能在类中定义。所以我还是被困住了。


您需要将专业化移至 BPCFGParser 内部的内部类中。这样做满足两个要求

  1. 专业化是在完整定义之后ActiveEquivClass
  2. 使用专业化之前

Example:

class BPCFGParser {

  class ActiveEquivClass {
    ...
  };

  template <>
  class hash<ActiveEquivClass> {
     public:
        size_t operator()(const BPCFGParser::ActiveEquivClass & aec) const {
        }
  };
  ...
  unordered_map<ActiveEquivClass, Edge *, hash<ActiveEquivClass>, EqActiveEquivClass> discovered_active_edges;

};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实例化后模板的特化? 的相关文章

随机推荐

  • 使用多核使用 g++ 进行编译

    快速问题 允许 g 生成自身的多个实例以便更快地编译大型项目 例如 多核 CPU 一次 4 个源文件 的编译器标志是什么 您可以使用 make 来完成此操作 使用 gnu make 时 它 是 j 标志 这对单处理器机器也有帮助 例如 如果
  • 程序终止后动态分配内存

    当包含动态分配内存 使用 malloc new 而没有 free delete 调用的 C C 程序终止时 动态分配的内存会发生什么 操作系统是否收回内存 或者其他程序是否无法访问该内存 我不认为语言标准有任何保证 但是支持稀疏虚拟内存和内
  • 对 SliverList 中的变化进行动画处理

    我目前有一个SliverList其项目是动态加载的 问题是一旦这些项目被加载 SliverList更新而不动画更改 在加载和加载之间进行转换very刺耳的 我看到AnimatedList存在 但它不是条子 所以我不能将它直接放入Custom
  • python 迭代文本文件直到满足条件

    我想继续迭代文本文件 直到满足循环内的当前条件 这是示例文本 10 01 N A 10 02 N A 10 03 N A 10 04 N A 10 05 N A 10 06 N A 10 07 N A 10 08 N A 10 09 N A
  • 用R计算多个多边形之间的最小距离

    我对 R 和 sf 包还是有点陌生 我有两组多边形数据正在尝试分析 我的第一组多边形 火灾 包含数百个野火周界 第二组 城镇 包含数百个城市区域边界 对于每次火灾 我想计算到最近城镇的距离 火灾多边形边缘到最近城镇多边形边缘 并将其作为字段
  • Meteor 的 Iron Router - 将多个路径路由到一个模板,但仍然是 DRY

    我想将多个路径路由到同一个模板 例如 abc home and home都会显示home模板 路径也可以有子路径 所以abc parent child and parent child也应该路由到相同的路径 I can 简单地重复 Rout
  • 使用 PHP 对从 CSV 数据构建的多维数组进行排序

    尝试对 PHP 中从 CSV 填充的数组进行排序 理想情况下 我也希望能够通过单击来控制排序此处表格中的选项卡 http wakeuptv com shows 不过 现在我手头的第一个任务就是整理该死的东西 已经为此工作了 3 天多了 非常
  • ASP.net 中的免费 PDF 查看器

    我有许多二进制格式的 PDF 文档 位于 SQL Server 2008 数据库中 我的 ASP net 页面中有一个 gridview 当用户单击记录的任何 ID 列时 我需要在浏览器中打开 pdf 有没有免费的 PDF 查看器控件 如何
  • 配置服务时如何通过依赖注入在 Azure Function V3 中注入或使用 IConfiguration

    通常在 NET Core 项目中 我会创建一个 引导 类来配置我的服务以及 DI 注册命令 这通常是一个扩展方法IServiceCollection我可以在哪里调用类似的方法 AddCosmosDbService并且所有必要的东西都是包含该
  • System.Web.Razor API 文档 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 此类型 成员支持 NET Framework 基础结构 并且不适合直接在代码中使用 谁能说出以下事实 System Web Razor http
  • 使用 Python 打开 Outlook

    我正在尝试使用 Python 打开 Outlook 但我得到了这个 import win32com client ol win32com client Dispatch outlook Application 它会打开 Outlook 但我
  • NgModule 中的声明、提供者和导入之间有什么区别?

    我试图理解 Angular 有时称为 Angular2 然后我遇到了 Module Imports 声明 供应商 下列的角度快速入门 https angular io guide quickstart 角度概念 imports使其他模块的导
  • PHP:从 javascript 重新加载验证码图像

    我有一个 PHP 中的用户注册表单 我将验证码图像检查放在页面中 我像这样使用它 img src captcha php alt Enter this text in the adjacent text box 在我的 javascript
  • 在 SQLite LIKE 中转义通配符 (%, _) 而不牺牲索引使用?

    我在 SQLite 查询方面遇到了一些问题 实际上我开始认为 SQLite 不是为超过 10 行的表设计的 真的 SQLite 是一场噩梦 以下查询 SELECT FROM Table WHERE Name LIKE Text 效果很好 E
  • 在微服务架构中扩展数据库

    假设我们有 5 个微服务 S 每个微服务都需要一个包含一些表的数据库 这些服务中的每一个都需要能够扩展 包括数据库查询 为此 据我所知 我们有几个选择 1 1 S 1 个实例 1 个数据库实例 不要水平缩放 只垂直缩放 2 1 S N 个实
  • 我可以为 Travis YAML 配置命令创建 ALIAS 吗? ...“travis 加密 GITHUB_TOKEN=****** --add”?

    我有一个个人访问令牌来自我在许多项目中使用的 Github 由于令牌对我的所有存储库都具有读 写能力 因此我使用Travis 命令行工具 https github com travis ci travis rb readme来加密GITHU
  • Django:检查是否设置了外键属性

    我有以下模型 class A models Model name models CharField max length 50 content type models ForeignKey ContentType 该模型应该是某些继承树中的
  • XML 命名空间和 XPath

    我有一个应用程序 必须根据 XPath 加载 XML 文档和输出节点 假设我从这样的文档开始
  • 空间索引减慢查询速度

    背景 我有一个包含代表客户区域的 POLYGONS MULTIPOLYGONS 的表 该表包含大约 8 000 行 大约 90 的多边形是圆形 其余的多边形代表一个或多个州 省或其他地理区域 这些形状的原始多边形数据是从美国人口普查数据 h
  • 实例化后模板的特化?

    我的完整代码太长 但这里有一个片段可以反映我的问题的本质 class BPCFGParser public class Edge class ActiveEquivClass class PassiveEquivClass struct E