C++ #include和运算符<<过载错误

C++ #include and operator<< overloading error

本文关键字:lt 错误 #include C++ 运算符      更新时间:2023-10-16

所以我3个类如下:

class Weapon {
char* name;
Target target;
int hitStrength;
public:
Methods...
};
class Player {
char* name;
int level;
int life;
int strength;
Weapon weapon;
int location;
public:
Methods...
};
class Game {
int maxPlayers;
Player** players;
public: 
Methods...
};

我在包含方面遇到问题。 我有一个main.cpp文件,其中包含以下内容:

#include "Game.h"
#include <iostream>
using namespace std;

但是,当我尝试构建程序时,出现以下错误:

In file included from C:UsersNameCLionProjectsCall Of Matam DutiesPlayer.h:8:0,
from C:UsersNameCLionProjectsCall Of Matam DutiesGame.h:8,
from C:UsersNameCLionProjectsCall Of Matam Dutiesmain.cpp:1:
C:UsersNameCLionProjectsCall Of Matam DutiesWeapon.h:30:12: error: 'ostream' does not name a type
friend ostream& operator<< (ostream& os, const Weapon& w);`

值得一提的是:
Player.cpp包括Player.h;Weapon.cpp包括Weapon.h;Game.cpp包括Game.h;Game.h包括Player.hWeapon.h

正确吗?

我该如何解决这个问题?

如果您需要更多信息,请告诉我

您应该在Weapon.h中包含<iostream>,因为这是需要的地方。每个头文件都应该是可自行编译的,它不应该依赖于放在其他包含之后。

有一个很好的做法可以避免这样的错误。你有Player.cpp包括Player.h;Weapon.cpp包括Weapon.h;Game.cpp包括Game.h。这很好,但请确保Player.cpp包含的第一个头文件Player.h,并且与所有其他头文件相同。如果该更改导致任何编译错误,则表明您的头文件是错误的,因为它们无法独立编译。

通过包含所需的头文件或添加前向声明来修复这些错误。但要小心,你不要以包含的循环结束,这是一个坏主意,通常可以通过前向声明来避免。

error: 'ostream' does not name a type

我们可以在这里推断,编译器认为"ostream"没有定义。因此,您需要通过在 Game.h 中包含 iostream 头文件来检查 ostream是否定义(因为 ostream 是在iostream头文件中定义的(。如果您在其他头文件中使用 ostream(或 istream、cin、cout 等(,请确保也#include <iostream>放入这些文件。

此外,如果您已经在 Game.h 中包含 iostream,则不需要 main.cpp 中的第 2 行 (#include <iostream>( (如果我错了,请纠正我(。

编辑:

由于您似乎对如何跟踪此错误感到困惑......编译器错误告诉您:

C:UsersNameCLionProjectsCall Of Matam DutiesWeapon.h:30:12:

这告诉您错误是在 Weapon.h 第 30 行中发现的,从左侧偏移 12 个字符。

除了其他答案之外,应该注意的是,如果只需要来自<iostream>的前向声明,则存在一个特殊的标头<iosfwd>,则可以并且应该使用它。通常,<iosfwd>包含在头.h文件中,<iostream>包含在实现.cpp文件中。更多信息可以在这篇SO帖子中找到。