c++ - 在继承的模板类中使用下标 [] 运算符
问题描述
我有一个模板类Array<T>
,其中定义了以下三个成员函数。
template <typename T>
const T& Array<T>::GetElement(int index) const {
if(index_out_of_bounds(index)) throw OutOfBoundsException(index);
return m_data[index];
}
template <typename T>
T& Array<T>::operator [] (int index) {
if(index_out_of_bounds(index)) throw OutOfBoundsException(index);
return m_data[index];
}
template <typename T>
const T& Array<T>::operator [] (int index) const {
if(index_out_of_bounds(index)) throw OutOfBoundsException(index);
return m_data[index];
}
接下来我有另一个模板类NumericArray<T>
,它继承自Array<T>
. 此类包含重载运算符+
。
template <typename T>
NumericArray<T> NumericArray<T>::operator + (const NumericArray<T> &na) const {
unsigned int rhs_size = this -> Size(), lhs_size = na.Size();
if(rhs_size != lhs_size) throw SizeMismatchException(rhs_size, lhs_size);
NumericArray<T> array_sum(rhs_size);
for(unsigned int i = 0; i < rhs_size; i++) {
array_sum[i] = this[i] + na[i];
}
return array_sum;
}
NumericArray<T>
现在假设我在 main.cpp 中实例化了两个实例,其中 T 的类型为int
。这两个实例都已经填充了整数值。
如果我现在尝试执行+
运算符,我会收到以下错误消息:
../NumericArray.tpp:44:16: 错误:无法在赋值 array_sum[i] = this[i] + na[i] 中将“NumericArray”转换为“int”;
但是,如果我返回并将重载的 for 循环中的实现更改为operator+
以下NumericArray<T>
内容。操作员按预期进行。
array_sum[i] = this -> GetElement[i] + na.GetElement[i];
如果下标运算符[]
具有等效的实现,为什么它们的行为不一样?
解决方案
问题是您正在尝试应用于operator []
指针类型:
for(unsigned int i = 0; i < rhs_size; i++) {
array_sum[i] = this[i] + na[i];
由于this
是一个指针,你必须要么
1)首先取消引用指针以应用重载运算符。
或者
2)应用->
运算符并使用operator
关键字访问重载的运算符。
以下是两种可能的解决方案的图示:
array_sum[i] = (*this)[i] + na[i];
或者
array_sum[i] = this->operator[](i) + na[i];
使用第二种解决方案,this
则不需要:
array_sum[i] = operator[](i) + na[i];
推荐阅读
- reactjs - reactJS中不同用户的不同视图
- python - 如何将 .docx 文件保存到 S3 中?
- python - 尝试将小数点添加到浮点数时出现键错误
- bash - 替换文件名中模式的最短匹配
- mysql - 不能使用有 sum 或有 count mysql 5.7
- java - Spring webclient如何多次提取响应主体
- python-3.x - 如何使用exchangelib库python在电子邮件正文中嵌入图像
- php - Amazon SQS 临时队列 (PHP)
- gulp - 将 gulp-livereload 与 gulp-sass 一起使用
- swift - swift中的\是什么意思?