在继承的模板类中使用下标 [] 运算符
Using the subscript [] operator in inherited template class
我有一个模板类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];
}
接下来,我有另一个从Array<T>
继承的模板类NumericArray<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;
}
现在假设我在 main 中实例化两个NumericArray<T>
实例.cpp 其中 T 的类型为int
。这两个实例都已填充整数值。
如果我现在尝试执行+
运算符,则会收到以下错误消息:
../NumericArray.tpp:44:16:错误:无法在赋值中将"NumericArray"转换为"int" array_sum[i] = 这个[i] + na[i];
但是,如果我返回并将重载operator+
for 循环中的实现更改为以下内容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];
相关文章:
- 一组值的零开销下标运算符
- 如何重载下标运算符 [] 以引用 2d STL 数组?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 在继承的模板类中使用下标 [] 运算符
- 为什么函数的任何索引处的下标运算符在C++中总是返回1
- c++下标运算符到下级类向量
- 数组下标运算符 ([ ]) 对数组有什么作用?
- 双标具有下标运算符的原因是什么?
- 基成员的重载下标运算符
- SFINAE 为什么我没有检测到 std::vector 的下标运算符?
- 如何重载下标运算符以返回可以是左值的可选值?
- C++下标运算符的继承规则
- 使用带有下标运算符的赋值运算符将值分配给 std::map
- 如何从重载的下标 [] 运算符返回 std::unique_ptr&?
- 为下标运算符和函数调用运算符提供默认参数
- C++ 下标运算符
- 将类实例作为指针传递,并在此指针上使用过载的下标运算符
- 如何为模板类的下标运算符
- 如何在提升 lambda 中使用下标运算符
- "飞机"不提供下标运算符是什么意思"