我定义了一个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)
答案 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 +
会员功能中有效,您可能永远不会使用它。