我试图通过重载加法运算符将两个排序列表合并在一起。我只需要遍历第一个和第二个列表一次,然后将每个元素添加到新列表中,然后返回该列表。我收到一个错误,说运算符必须采用零或一个参数,但是当我尝试一个不起作用的参数时。这是我的代码:
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;
}
答案 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+
。编译器告诉您的0
或1
参数是您正在编写成员函数的事实,因此来自this
的部分您应该:
operator+
,如int x = +a
)operator+
,如int x = a + b
)你想要的可能是第二个。因此,您可以执行以下任一操作:
a
(*this)