我会让你试着在一分钟内告诉我这个继承*,但是现在我希望找出这个错误发生的原因。
这是一个在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的实现,而继承似乎是最直接的方法。即使语言允许,我也不打算多态地在两种地图之间切换,所以虚拟或缺乏应该不是问题。
答案 0 :(得分:1)
在map
和unordered_map
的MSVC实施(可能由标准定义?)中,别名value_type
为std::pair<const key_type, mapped_type>
。 key_type
的{{1}}和value_type
以某种方式隐藏了派生类中的模板类型参数。如果您将它们重命名为std::unordered_map
和key_type_
,它应该有效。
我不确定为什么 value_type_
中的typedef
会掩盖该类的模板参数。我认为this question询问了这一点,而评论似乎表明它是MSVC扩展。