我有一个类模板,其中包含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语言的新手,我知道我在这里可能犯了一些非常愚蠢的错误,但是请提供任何形式的帮助。
答案 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