首页 > 解决方案 > 如何从函数运算符(x,y)返回向量元素的引用

问题描述

我有一个类模板,其中包含一个 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 错误:'return':无法从 'const_Ty' 转换为 'T&'

如果我将运算符函数声明为:

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

然后我的代码编译但是如果例如我创建一个派生的模板类,其中 T 是浮点数并且我写(obj 是派生类的对象,具有浮点数的成员变量向量):

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

然后似乎什么也没有发生。向量内 i,j 位置的浮点数没有改变,因此假设我没有真正处理引用,因为如果操作符 () 返回了引用,则上述行应更改位置 (i,j) 中的元素正确的?

我是 C++ 新手,我知道我在这里可能会犯一些非常愚蠢的错误,但欢迎任何形式的帮助。

标签: c++vectorreferenceoperator-keyword

解决方案


声明不带 的运算符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

推荐阅读