在继承的模板类中使用下标[]运算符

时间:2018-08-27 00:04:07

标签: c++ templates inheritance operator-overloading

我有一个模板类class PermsServer { has(role, companyIds = null, value = null){ const self = this; const rolesData = self._getRoles(role, companyIds); if (!rolesData[0]) return false; // Check roles const hasRole = self._checkType(rolesData[0], value); return hasRole; } _getRoles(roles = null, companyIds = null){ const self = this; const cursor = self.dataScope.aggregate([ { $match: filter }, { $lookup: { from: 'nx_perms', localField: 'role', foreignField: 'role', as: 'perm_docs' } } ]); return cursor.toArray(); // This returns a promisse 'Pending' } } ,其中定义了以下三个成员函数。

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>

+

现在假设我在main.cpp中实例化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; } 的两个实例 其中T为NumericArray<T>类型。两个实例都已经填充了整数值。

如果我现在尝试执行int运算符,则会收到以下错误消息:

  

../ NumericArray.tpp:44:16:错误:分配中无法将“ NumericArray”转换为“ int”      array_sum [i] = this [i] + na [i];

但是,如果我返回并将+中重载的operator+的for循环中的实现更改为以下内容。操作员会按预期进行。

NumericArray<T>

如果下标运算符array_sum[i] = this -> GetElement[i] + na.GetElement[i];具有相同的实现,为什么它们的行为不相同?

1 个答案:

答案 0 :(得分:4)

问题是您正尝试将1.25kg, 2.5kg, 5kg, 10kg, etc应用于指针类型:

GYM EQUIPMENT WEIGHT
----------------------
id   GymId    EquipmentId    Weight
1    1        3              2.5
2    1        3              5
3    1        3              10
4    1        3              25
5    1        3              35
6    1        3              45
7    2        3              5
8    2        3              25
9    2        3              45
.......

由于operator []是一个指针,因此您必须

1)首先取消引用指针以应用重载的运算符。

2)应用 for(unsigned int i = 0; i < rhs_size; i++) { array_sum[i] = this[i] + na[i]; 运算符,然后使用this关键字访问重载的运算符。

以下是两种可能的解决方案的说明:

->

operator

在第二种解决方案中, array_sum[i] = (*this)[i] + na[i]; 不是必需的:

    array_sum[i] = this->operator[](i) + na[i];