0

在我的代码中,我创建了两个覆盖 [] 运算符的模板函数(构建我的 STL 映射版本的练习):

const V& operator[](const K& key) const;    // X = map["kuku"]

V& operator[](const K& key);                // map["kuku"] = x

然后我通过以下函数使用运算符:

invokeStkCmd (my_stacks[stk_name], my_cmds[crnt_word]);

谁的模板是

invokeStkCmd (StackComp* stkPtr, const shake_cmds_t cmd)

此调用使用V& operator[](const K& key)模板(至少对于第二个参数),它可以向地图添加条目,而不是我想要的其他模板。参考 Stack Overflow 上最近的运算符重载帖子,看来我的运算符重载模板函数没问题。我是否需要在我的 invokeStkCmd 函数中做一些事情,或者我的运算符重载函数毕竟不准确?

4

1 回答 1

0

在处理要修改时行为差异很大的对象时,这是一个常见问题。这是由一个简单的事实引起的,即仅基于参数类型而不是返回类型或返回值的使用来解决重载。所以最简单的解决方案是在索引发生之前使用 aconst_cast来制作地图对象:const

invokeStkCmd (my_stacks[stk_name], const_cast<my_map<Whatever> const&>(my_cmds)[crnt_word]);

由于冗长且容易出错,这可能无法满足您的要求;在这种情况下,还有一种高级方法可以利用转换运算符重载根据其返回类型解析这一事实,这与普通函数不同。我在这里发布了这样的答案。请注意,很难做到正确。

于 2012-06-24T19:12:47.067 回答