【发布时间】:2021-02-16 09:12:56
【问题描述】:
我的任务是通过实现具有各种功能的数组类来改进 C 数组。我正在尝试重载“[]”,但遇到了问题。
template<typename T>
class SA{
private:
T* pT;
//other vars...
public:
//other initialization functions...
int& operator [](int offset);
};
template<typename T>
int& SA<T>::operator [](int offset){
if (offset < lIdx || offset > hIdx){
std::cout << "invalid index:" << std::endl;
}
return pT[offset];
}
int main(){
SA<float> thing1(15);
thing1[5] = 5;
return 0;
当我使用这个重载函数时,我遇到了这个错误:
错误:无法将“int&”类型的非常量左值引用绑定到 “int”类型的右值
但是,如果我理解正确,如果删除“&”,则无法使用“=”重新分配该索引的值。如果我这样做,编译器也会抛出这个错误:
错误:需要左值作为赋值的左操作数
我应该在这里做什么?
【问题讨论】:
-
返回类型不应该是
T&而不是int&吗? -
数组的类型为
float,但您的operator[]正试图返回int& -
当您将此模板类用于
const int值类型时,问题出在返回类型上。尝试为此添加另一个重载 -
如果偏移量不在范围内,抛出异常
std::out_of_range而不是让程序崩溃 -
@Wander3r:不,崩溃非常合理。投掷变体应该命名为
at(),就像std::vector::at和std::array::at。数组类是非常原始的构建块,添加无法访问的异常代码会减慢很多代码。
标签: c++ templates overloading