提问人:Santeau 提问时间:6/3/2021 最后编辑:Santeau 更新时间:6/3/2021 访问量:2289
C++ - 二进制表达式“basic_ostream<char>的操作数无效
C++ - Invalid operands to binary expression 'basic_ostream<char>'
问:
我有一个带有整数动态数组的“IntList”类,但是以下测试代码片段给我带来了麻烦:
主 .cpp
#include <iostream>
#include "IntList.hpp"
using std::cout;
using std::endl;
int main(int argc, const char * argv[]) {
IntList list{};
cout << "list-1 -> " << list << endl;
return 0;
}
IntList.hpp:
#ifndef IntList_hpp
#define IntList_hpp
#include <stdio.h>
using std::ostream;
class IntList
{
public:
int *dynarray;
int capacity;
int used;
IntList();
void pushBack(int x);
int getCapacity();
void print(ostream& sout);
};
#endif
IntList的.cpp
#include <iostream>
#include "IntList.hpp"
using std::cout;
using std::endl;
using std::string;
using std::ostream;
IntList::IntList()
{
int capacity = 1;
int used = 0;
int *dynarray = new int[capacity];
}
ostream& operator<<(ostream& sout, const IntList& list)
{
for (int i = 0; i < list.used; ++i)
sout << list.dynarray[i] << " ";
return sout;
}
据我了解,我试图用这个来重载<<运算符:二进制表达式('ostream'(又名'basic_ostream<char>')和'ostream')无效的操作数,但我不知道我在哪里弄错了,因为XCode给了我这个错误:
Invalid operands to binary expression ('basic_ostream<char>' and 'IntList')
知道如何解决这个问题吗?
答:
4赞
Adrian Mole
6/3/2021
#1
从您显示的片段来看,头文件 () 中没有覆盖的声明。因此,函数中的代码不知道(也不能)知道该重写,该重写在单独的源文件中提供。<<
IntList.hpp
main
您需要在标头中添加该覆盖函数的声明(通常,就在类定义之后),如下所示:
// Declaration (prototype) of the function for which the DEFINITION is provided elsewhere
extern ostream& operator<<(ostream& sout, const IntList& list);
此外,您的构造函数存在一些严重的错误。在其中,您将值分配给三个局部变量(当构造函数完成时,其数据将完全丢失)。这些变量隐藏了具有相同名称的成员变量。请改用它(即删除声明说明符):IntList
int
IntList::IntList()
{
// int capacity = 1; // This declares a local variable that hides the member!
capacity = 1;
used = 0;
dynarray = new int[capacity];
}
评论
1赞
Remy Lebeau
6/3/2021
"此外,你的 IntList
构造函数有一些严重的错误“——整个类都是有缺陷的,因为它违反了 3 法则。它缺少一个释放数组的析构函数,以及一个复制构造函数和复制赋值运算符来制作数组的副本。
评论
ostream& operator<<(ostream& sout, const IntList& list)
operator<<
{ list.print(sout); return sout; }
print
getCapacity
const