c ++ - 不能在模板类成员函数中使用之前定义的重载运算符

时间:2018-04-22 05:01:28

标签: c++ templates overloading

我定义了一个Point<T, Size>模板类,其成员变量为std::array。我重载[]运算符以方便地访问数组,但是,我发现在以下某些成员函数中,我不能使用[]运算符,否则会使用其他运算符。

我在想这是否是与模板类相关的问题?

注意:Vector也是一个类似于Point的模板类,我认为它的定义与错误无关。如果需要,我会在此处发布其代码。

template<typename T, unsigned Size>
    class Point {
    private:
        std::array<T, Size> _p;
    public:
        static const unsigned size = Size;

        inline T &operator[](unsigned i) { return _p[i]; }

        inline Point operator+(const Point &other) {
            Point ret;
            for (int i = 0; i < Size; i++) {
                ret._p[i] = _p[i] + other[i]; // OK to directly access _p with [] operator
            }
            return ret;
        }

        inline Vector<T, Size> operator-(const Point &other) {
            Vector<T, Size> ret;
            for (int i = 0; i < Size; i++) ret[i] = _p[i] - other._p[i]; // compiler error if use other[i] directly
            return ret;
        }
    };

我认为两个评论函数之间的唯一区别是返回类型。谁能告诉我为什么[]运算符的用法不同?

error C2678: binary '[': no operator found which takes a left-hand operand of type 'const Point<float,3>' (or there is no acceptable conversion)

1 个答案:

答案 0 :(得分:0)

问题是operator [] const无法使用Point。通常,在提供operator []时,您希望成对提供它:

inline T &operator[](unsigned i) { return _p[i]; }
inline T const &operator[](unsigned i) const { return _p[i]; }

至于为什么这在您的operator +会员功能中有效,您可能永远不会使用它。