+ 运算符重载中的错误
Error in + operator overloading
class Array
{
private:
int siz;
int *ptr;
public:
// constructos, setters, getters, and other functions.
void operator+(int x) // Addition operator
{
Array temp(siz+1);
for(int i = 0; i<temp.size; i++)
{
temp.ptr[i] = ptr[i];
if(i == temp.siz -1)
temp.ptr[i] = x;
}
deallocate();
siz = temp.siz;
ptr = new int[siz];
for(int i= 0; i<siz;i++)
{
ptr[i] = temp.ptr[i];
}
delete [] temp.ptr;
temp.ptr = NULL;
};
//GLOBAL FUNCTUONS
ostream &operator<< (ostream &o,Array A)
{
for(int i = 0; i < A.siz; i++)
{
out << A.ptr[i] << " ";
}
o << endl;
return out;
}
istream &operator>> (istream &in, Array &A)
{
int val;
for(int i=0; i<S.siz; i++)
{
cout << "Enter value at S["<<i<<"]: ";
cin >> value;
A.setter(i,val);
}
return in;
}
int main()
{
Array A1(2);
cin >> A1;
cout << A1 + 4;
}
编译器给出以下错误:
/usr/include/c++/4.8/ostream:476:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char)
operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
note: cannot convert ‘S2.Set::operator+(4)’ (type ‘void’) to type ‘char’
**cout << S2 + 4;**
我在类中为 ostream/istream 提供了好友函数。 ^
您尝试打印operator+
的返回值,但没有。它的返回类型是void
,如何打印void
?
使operator+
返回对对象的引用:
Array& operator+(int x) {
// ...
return *this; // reference to self
}
但请注意,使用 +
来指示追加到现有数组似乎有点奇怪。 +
通常意味着"将这两件事结合起来,把结果还给我"。例如,2+3
是5
,但它不会尝试将2
的值更改为5
。这根本说不通。
你可以像你一样使用operator+
,但这对我来说没有多大意义。也许你可以称它为append()
,或者insert()
?
另外,您有一个错误:
Array temp(siz+1);
for(int i = 0; i<temp.size; i++)
{
temp.ptr[i] = ptr[i]; // <------- HERE
if(i == temp.siz -1)
temp.ptr[i] = x;
}
在标记的行中,您可以访问原始数组的末尾。相反,向上迭代到 this->siz
,然后单独分配新数组中的最后一个元素:
Array temp(this->siz+1);
for(std::size_t i = 0; i < this->siz; +i)
{
temp.ptr[i] = this->ptr[i];
}
temp.ptr[this->siz] = x;
(叫它siz
是怎么回事?这很令人困惑,看起来像一个错字。
您的operator+
返回void
。 当您使用
cout << A1 + 4;
你实际上可以这样写
cout << A1.operator+(4);
现在您可以看到,我们尝试输出的是 返回对operator+(4)
的调用 . 因为它是void
它将失败,因为我们无法输出空白。 你需要operator+
返回对对象的引用或返回临时 by 值。
相关文章:
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 在运算符重载定义中使用成员函数(const错误)
- 重载方法的方式会在使用临时调用时生成编译器错误
- 数组索引重载错误
- C++:需要帮助了解运算符重载错误
- 在类Bat代码中,这给了我错误:重载的"Bat()"的调用是不明确的Bat(;)
- 不明确的错误重载运算符<<QdataStream 子类和个人类
- 具有相同参数的不同模板模板参数的错误重载函数
- 编译错误:重载函数的多个实例与 arument 列表匹配
- clang-libc++错误:重载解析选择了隐式删除的复制赋值运算符
- 错误:重载的调用不明确
- C++ 编译器选择输出流运算符<<的错误重载
- 分段错误重载运算符<<
- 错误:重载函数的多个实例与参数列表匹配
- 错误:重载的“max(int, int)”的调用不明确
- C++编译器选择类成员函数的错误重载
- 编译错误:重载操作符()
- 错误:重载的“bind(int(Class::*)(int,int),Class*,int,int”的调用不明确
- 未解析的外部符号错误重载操作符+模板
- 错误重载在构建"OpenSubdiv"时具有类似的转换