C++ #include和运算符<<过载错误
C++ #include and operator<< overloading error
所以我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.h
和Weapon.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帖子中找到。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- &lt;&lt;操作员在C 中超载错误
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- '&lt;'''&lt;'''&quot的模板类错误''令牌”
- 在尝试超载&lt;&lt;时链接错误2005和1169操作员
- 错误:没有匹配'运算符<<"在'std::cout
- 过载<<比如cout错误
- 重载& lt; & lt;为什么我得到以下错误
- 重载ostream&时转换错误无效;operator< & lt;
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多
- 编译器错误,包括'<'代币
- 重载& lt; & lt;错误