扩展unordered_map,覆盖operator [],MSVC 2015错误

时间:2016-02-19 00:39:37

标签: c++

我会让你试着在一分钟内告诉我这个继承*,但是现在我希望找出这个错误发生的原因。

这是一个在MSVC 2015中重现问题的精简示例:

template<typename key_type, typename value_type>
class my_unordered_map : public unordered_map<key_type, value_type>
{
    public:
        value_type& operator[](const key_type& key)
        {
            return unordered_map<key_type, value_type>::operator[](key);
        }
};

int main()
{
    my_unordered_map<string, int> m;
    m["x"] = 42;
}

my_unordered_map打算做的所有事情(到目前为止)都覆盖一个成员函数并将调用委托给其重写的基本成员函数。但我得到的错误是MSVC 2015:

binary '=': no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)

有什么想法?

*好的,现在你可以试着说服这个继承了。要点是我想要一个unordered_map +一个额外的功能。但除了该功能之外,我仍然希望保留整个接口和unordered_map的实现,而继承似乎是最直接的方法。即使语言允许,我也不打算多态地在两种地图之间切换,所以虚拟或缺乏应该不是问题。

1 个答案:

答案 0 :(得分:1)

mapunordered_map的MSVC实施(可能由标准定义?)中,别名value_typestd::pair<const key_type, mapped_type>key_type的{​​{1}}和value_type以某种方式隐藏了派生类中的模板类型参数。如果您将它们重命名为std::unordered_mapkey_type_,它应该有效。

我不确定为什么 value_type_中的typedef会掩盖该类的模板参数。我认为this question询问了这一点,而评论似乎表明它是MSVC扩展。

相关问题