扩展unordered_map,重载operator[],MSVC 2015错误

3

我等一下再听你劝我放弃这份遗产,现在我想了解为什么会出现这个错误。

这里是一个简化的示例,可以在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
这里编译通过(http://coliru.stacked-crooked.com/a/c27207d7dc531dce)。使用gcc也可以运行(http://coliru.stacked-crooked.com/a/6dfb851d039474ec)。你正在使用哪个编译器? - Baum mit Augen
嗯。看起来你是对的。当我使用gcc 4.9进行编译时,它可以正常编译。但是当我使用MSVC 2015进行编译时,就会出现上述错误。 - Jeff M
1个回答

1
在MSVC的实现中(可能由标准定义?)mapunordered_map的别名value_typestd::pair<const key_type, mapped_type>。在您派生类中,std::unordered_mapkey_typevalue_type以某种方式隐藏了模板类型参数。如果将它们重命名为key_type_value_type_,它应该可以工作。
我不确定为什么unordered_map中的typedef会掩盖类的模板参数。我认为this question正在询问此事,并且评论似乎表明这是MSVC的扩展。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接