如何从函数运算符(x,y)返回矢量元素的引用

时间:2018-12-29 21:25:31

标签: c++ vector reference operator-keyword

我有一个类模板,其中包含T的向量作为受保护的成员变量。我想重载operator(),以便它在y行和x列中返回向量元素的引用。

当我将operator()函数声明为:

template <class T>
T & ArrayT<T>::operator()(unsigned int x, unsigned int y)const{
    return buffer[y*width + x];
}

我收到C2440错误:“返回”:无法从“ const_Ty”转换为“ T&”

如果我将运算符声明为:

template <class T>
const T & ArrayT<T>::operator()(unsigned int x, unsigned int y)const{
    return buffer[y*width + x];
}

然后我的代码进行编译,但是例如,如果我创建一个派生的Templeted类,其中T为float并且我编写(obj是该派生类的对象,其成员变量向量为floats):

float f=obj(i,j); 
f=pow(f,2);

然后似乎什么都没有发生。向量中位置i,j处的浮点数不会改变,因此假设我对引用没有实际作用,因为如果操作员()返回了引用,则上述几行应更改位置(i,j)中的元素对吧?

我是C语言的新手,我知道我在这里可能犯了一些非常愚蠢的错误,但是请提供任何形式的帮助。

1 个答案:

答案 0 :(得分:2)

声明不带const的运算符,如下所示:

template <class T>
T & ArrayT<T>::operator()(unsigned int x, unsigned int y) {
    return buffer[y*width + x];
}

访问这样的元素:

float & f = obj(i, j);

我们通常提供const运算符(如OP那样):

template <class T>
const T & ArrayT<T>::operator()(unsigned int x, unsigned int y) const {
    return buffer[y*width + x];
}

float f = obj(i, j);          // f is copy of current i,j value 

const float & f = obj(i, j);  // f references i,j value, i.e. we can
                              // observe future modifications