声明将字符串映射到模板的 unordered_map 时出错

Posted

技术标签:

【中文标题】声明将字符串映射到模板的 unordered_map 时出错【英文标题】:Error in declaring unordered_map which maps string to a template 【发布时间】:2017-06-06 15:27:30 【问题描述】:
template<typename T>
struct hash;

template<typename T> class WUG
    public:
        WUG()
            unordered_map<string,typename T,hash> vertexmap; //Problem
        
;

我在这段代码中遇到了一些错误,这对我没有任何意义。如何正确申报?

我收到的错误消息是: [错误] 模板参数 2 无效 [错误] 模板参数 5 无效

【问题讨论】:

您可能正在使用using namespace std;。这可能会在 std::hash 和您声明的 ::hash 之间造成一些混淆。 minimal reproducible example 是有序的。此外,编译器很清楚T 命名了一个类型。这是一个模板参数。 你的地图由三个参数组成,一个地图只接受两个,它就像一个键值对 - map @zenwraight 这是不正确的。 std::unordered_map 可能有多达 5 个模板参数,其中 3 个提供默认值。 啊,我不知道,嗯,很高兴在这里学到一些东西 【参考方案1】:

您有 using namespace std;,它从 std 命名空间导入所有名称,包括 std::hash,修复:

struct MyHash;

template <typename T>
class WUG 
public:
  WUG() 
    unordered_map<string, T, MyHash> vertexmap; //Problem
  
;

或使用标准哈希:

template <typename T>
class WUG 
public:
  WUG() 
    unordered_map<string, T> vertexmap; //Problem
  
;

【讨论】:

@BatzorigZorigoo 如果您想使用std::hash&lt;T&gt;,请不要为您的地图提供第三个模板参数。这是使用std::unordered_map 的默认哈希实现。 @BatzorigZorigoo std::hash 适用于std::string 以及许多其他标准类型。 @FrançoisAndrieux 不错!但我删除了 using namespace std;并在需要的地方添加了 std:: 。但我仍然有同样的错误 @BatzorigZorigoo 如果您要对问题进行更改,请编辑问题。如果这些更改会彻底改变问题,请发布另一个问题。

以上是关于声明将字符串映射到模板的 unordered_map 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Vue 错误“模板应该只负责将状态映射到 UI。”

vue Dynamic Slot Names 错误模板应该只负责将状态映射到 UI

将一个函数模板的模板参数映射到另一个函数模板的参数(c ++)

Angular 4 - 将对象数组映射到模板中的 ngModel 驱动

Gatling 2.0.3 - 将值映射到模板

是否可以将所有阶段变量添加到嵌套 JSON 结构中的主体映射模板中?