声明将字符串映射到模板的 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
命名了一个类型。这是一个模板参数。
你的地图由三个参数组成,一个地图只接受两个,它就像一个键值对 - mapstd::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<T>
,请不要为您的地图提供第三个模板参数。这是使用std::unordered_map
的默认哈希实现。
@BatzorigZorigoo std::hash
适用于std::string
以及许多其他标准类型。
@FrançoisAndrieux 不错!但我删除了 using namespace std;并在需要的地方添加了 std:: 。但我仍然有同样的错误
@BatzorigZorigoo 如果您要对问题进行更改,请编辑问题。如果这些更改会彻底改变问题,请发布另一个问题。以上是关于声明将字符串映射到模板的 unordered_map 时出错的主要内容,如果未能解决你的问题,请参考以下文章
vue Dynamic Slot Names 错误模板应该只负责将状态映射到 UI
将一个函数模板的模板参数映射到另一个函数模板的参数(c ++)