2个变体中的重载[]问题

时间:2010-10-07 10:19:09

标签: c++ operator-overloading

这是我的通用类:

template<class T, class PrnT>
class PersonalVec {

public:
    PersonalVec();
    T &operator[](int index) const;
    const T &operator[](int index) const;

private:
    std::vector<T> _vec;

};

我需要实现2个版本的[]运算符:
一个将返回一个const引用,另一个将返回一个引用。 当我编译它时,我得到:
PersonalVec.hpp:23: error: ‘const T& PersonalVec<T, PrnT>::operator[](int) const’ cannot be overloaded
PersonalVec.hpp:22: error: with ‘T& PersonalVec<T, PrnT>::operator[](int) const

我把它们中的任何一个作为注释然后它确实编译,所以我猜它们会以某种方式发生碰撞。有什么问题,如何解决?

谢谢你!

4 个答案:

答案 0 :(得分:3)

你需要:

T &operator[](int index);
const T &operator[](int index) const;

即。非const运算符返回非const引用,const one返回const引用。

答案 1 :(得分:2)

您不能基于返回类型重载,您只能基于参数类型重载,包括成员函数的隐藏this参数。

函数调用表达式的类型或涉及潜在重载运算符的表达式由重载决策选择的函数类型决定,您不能强制这样的表达式具有特定类型并尝试影响重载决策返回类型。

您需要根据参数类型或const的{​​{1}}给出重载函数签名,或者您需要选择一个适当的返回类型并使用单个函数。

答案 2 :(得分:0)

返回非const引用时,需要删除函数的constness。

T &operator[](int index);
const T &operator[](int index) const;

重载不会也不会发生在返回类型上。

答案 3 :(得分:-1)

函数的返回类型不是可用于重载函数的条件。 如果出现以下情况,则可以重载功能:
1.不同的论点 2.不同的论证顺序或
3.不同类型的论点

你试图根据返回类型重载函数,因此它会给出错误 即使不满足上述3个标准, 'const' 关键字也可以帮助您重载功能。如此简单的解决方案可以是使其中一个函数const并将其他函数保持为正常函数