首页 > 解决方案 > 在继承的模板类中使用下标 [] 运算符

问题描述

我有一个模板类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];

如果下标运算符[]具有等效的实现,为什么它们的行为不一样?

标签: c++templatesinheritanceoperator-overloading

解决方案


问题是您正在尝试应用于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];

推荐阅读