重载+运算符以添加数组

时间:2015-02-15 20:40:42

标签: c++ arrays sorting overloading operator-keyword

我试图通过重载加法运算符将两个排序列表合并在一起。我只需要遍历第一个和第二个列表一次,然后将每个元素添加到新列表中,然后返回该列表。我收到一个错误,说运算符必须采用零或一个参数,但是当我尝试一个不起作用的参数时。这是我的代码:

  template<class mytype>
OrderedList<mytype> operator+ (const OrderedList<mytype>& a,const OrderedList<mytype>& b)
{
int size = a.size() + b.size();
int i=0, j=0, k=0;
OrderedList<mytype> newList(size);

   while (i < a.size() && j < b.size()) 
   {
        if (a.get(i) <= b.get(j)) 
        {
             newList.list[k] = a.list[i];
              i++;
        } else 
        {
              newList.list[k] = list[j];
              j++;
        }
        k++;

  if (i < a.size())
  {
        for (int p = i; p < a.size(); p++) 
        {
              newList.list[k] = a.list[p];
              k++;
        }
  } else 
  {
        for (int p = j; p < count; p++) 
        {
              newList.list[k] = list[p];
              k++;
        }
  }
}

return newList;

}

2 个答案:

答案 0 :(得分:3)

如果二元运算符是非成员函数,则只能用两个参数声明。在::中使用范围解析运算符OrderedList<mytype>::operator+表示operator+OrderedList<mytype>的成员函数,但如果是这样,则不能使用两个参数。第一个参数隐式地是指向当前对象的指针,第二个参数是右手参数。

如果函数在friend中声明为OrderedList<type>,那么它是非成员函数,您可以将其定义为:

OrderedList<mytype> operator+(const OrderedList<mytype>& a, const OrderedList<mytype>& b);

即没有范围解析运算符。

如果它被声明为成员函数(仅在右侧),则将其定义为:

OrderedList<mytype> OrderedList<mytype>::operator+(const OrderedList<mytype>& b);

左手参数隐式this

答案 1 :(得分:2)

您当前的operator+正在考虑3个参数。两个显式和一个隐式(this)。所以这不是有效的operator+。编译器告诉您的01参数是您正在编写成员函数的事实,因此来自this的部分您应该:

  • 接受0个额外的参数(并且有一元operator+,如int x = +a
  • 获取1个额外的参数(并且具有二进制operator+,如int x = a + b

你想要的可能是第二个。因此,您可以执行以下任一操作:

  • 使用a
  • 替换正文中出现的所有(*this)
  • 将该操作符移出类并有效地声明一个自由函数(推荐)