C++模板类HashMap实例化提示无匹配初始化构造函数问题
问题原因
编译报错核心来自两处问题:
- 构造函数存在笔误:第二个构造函数的值参数类型声明错误。你在类内声明和类外实现中,都把第二个参数写为
const std::vector<KeyT> &values,但值列表的元素类型应该对应模板参数ValueT而非KeyT。当你显式实例化HashMap<std::string, float>时,编译器会判定这个构造函数需要的两个参数都是std::vector<std::string>类型,但你传入的第二个花括号列表是浮点值,类型完全不匹配,自然找不到可用的构造函数。 - C++语法规则限制:独立的花括号初始化列表(即你直接写的
{"a","b","c"}这种形式)不能在函数传参时自动隐式推导为std::vector类型,即使参数类型写对,直接传入裸花括号列表也可能触发编译错误。
修复方案
- 首先修正构造函数的参数类型笔误,类内声明和类外实现的第二个参数,都要把vector的模板参数从
KeyT改为ValueT:
修正后的类内构造函数声明:
HashMap(const std::vector<KeyT> &keys, const std::vector<ValueT> &values);
修正后的类外构造函数实现头部:
template<class KeyT,class ValueT> HashMap<KeyT,ValueT>::HashMap (const std::vector<KeyT> &keys, const std::vector<ValueT> &values) { // 原有长度校验、初始化逻辑不需要改动 if (keys.size() != values.size()) { throw std::length_error("keys and values must have the same length"); } _table = new std::vector<std::pair<KeyT,ValueT>> [DEFAULT_CAPACITY]; _capacity = DEFAULT_CAPACITY; _size = EMPTY_SIZE; for (int i = 0; i < (int)keys.size() ; ++i) { // 后续插入逻辑待实现 } }
- 调用构造函数时显式构造
std::vector对象传入,规避花括号列表无法隐式转换的问题:
HashMap<std::string, float> hash_m ( std::vector<std::string>{"a", "b", "c"}, std::vector<float>{1.0f, -0.34f, 11.f} );
如果想要支持直接传花括号列表的简写调用形式,可以额外增加接收std::initializer_list的构造函数重载,对于当前场景,完成上面两步修改后即可正常编译通过。
内容的提问来源于stack exchange,提问作者Liel Azulay
相关产品推荐
相关产品推荐

