以下是我程序中的头文件。 我收到编译错误,说我在partyPack之前错过了一个分号。 没有遗漏。还有其他两个错误,但我不记得它们是什么。
对我来说真正令人困惑的是我发表了Pack partyPack的评论;编译(失败,因为它在.cpp中引用),当我取消注释并再次尝试时,它编译并运行。
什么可能导致这种行为?
#ifndef PARTY_INTERFACE
#define PARTY_INTERFACE
#include "utility.h"
#include "Pack.h"
#include "Shop.h"
#include "Assets.h"
struct member
{...};
class Party
{
private:
const static int TEAMSIZE = 4;
member team[TEAMSIZE];
Pack partyPack;
const Inventory* itemList;
public:
Party(const Inventory* inputList);
void newTeam();
bool load();
bool save();
void findItem();
const void showParty();
const void showInventory();
void addToInventory();
~Party(void);
};
#endif
更新1 我能够复制错误...... 下面是一个github repo的链接,其中包含程序的文件供参考,随意下载和调试等。最后一次提交在VC ++ 2010中为我编译。我已经注释掉了需要windows.h的部分,它是应普遍编译......我希望。
https://github.com/dsball/RPGShop/tree/master/RPGShop
更新2 我已将问题隔离到Party.h中包含的一个头文件或Party.h本身中的某些内容发生了变化。输入int的简单行为;并立即删除它(这两个步骤之间没有任何内容)导致错误。错误如下:
错误1错误C2146:语法错误:缺少';'在标识符'partyPack'party.h 30之前
错误2错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int party.h 30
错误3错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int party.h 30
然后我在Pack.h中对第30行进行评论// Pack partyPack,编译/开始调试(失败),取消注释同一行并重试,它运行得很好。
更新3 在学习了Pack()编译指示后,我已经用背包替换了Pack,但问题仍然存在。
正如其他人所提到的那样,似乎有些东西干扰了Party的定义,但我找不到它的含义。
答案 0 :(得分:2)
(在以后的版本中,pack已经重命名为背包。这个答案用'背包'代替'pack')
在G ++下编译时(经过适当修改以删除特定于Windows的代码后),我收到此错误:
$ g++ -std=c++0x *.cpp
In file included from Shop.h:6:0,
from Backpack.h:5,
from Backpack.cpp:1:
Party.h:30:2: error: ‘Backpack’ does not name a type
看起来问题是Backpack.h包含party.h,但在Backpack.h的第5行,背包类尚未定义。 Party.h在第5行包含Backpack.h,但由于已经包含了Backpack.h,#ifndef语句会阻止Backpack.h第二次被包含(否则会创建一个无限循环的#include语句)。
总之,看起来这个问题是由于循环依赖性造成的。我会找到一种方法来打破Backpack.h和Party.h之间的依赖循环。
就为什么这是片状的,我猜测VC缓存完全加载的头作为优化。如果Backpack.h已经满载,则不会发生此错误。
答案 1 :(得分:1)
很可能Pack未定义。但是有一个标题存在可能定义它,所以...是否在另一个名称空间中定义? (您可能需要使用显式命名空间定位器,如pack_namespace :: Pack partyPack;)