2

下面是我程序中的一个头文件。我收到一个编译错误,说我在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 存储库的链接,其中包含程序文件以供参考,随时下载和调试等。在 VC++ 2010 中为我编译的最后一次提交。我已经注释掉需要 windows.h 的部分,它应该可以普遍编译......我希望。

https://github.com/dsball/RPGShop/tree/master/RPGShop

更新 2 我已将问题隔离为任何时候在 Party.h 或 Party.h 本身包含的头文件之一中发生更改。输入 int a 的简单动作;并立即删除它(这两个步骤之间没有任何内容)会导致错误。错误如下:

错误 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 //Pack partyPack 中注释第 30 行,编译/开始调试(失败),取消注释同一行并重试,它运行得很好。

更新 3 在得知有 Pack() pragma 后,我已将 Pack 替换为 Backpack,但问题仍然存在。

正如其他人所提到的,似乎确实有一些东西干扰了派对的定义,但我找不到它是什么。

4

2 回答 2

2

(在以后的版本中,pack 已重命名为背包。此答案使用 'backpack' 代替 '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 行,尚未定义 Backpack 类。Party.h 在其第 5 行中包含 Backpack.h,但由于 Backpack.h 已经包含在内,#ifndef 语句会阻止 Backpack.h 被第二次包含(否则会创建 #include 语句的无限循环)。

总之,看起来这个问题是由于循环依赖造成的。我会找到一种方法来打破 Backpack.h 和 Party.h 之间的依赖循环。

至于为什么这是不稳定的,我猜测 VC 缓存完全加载的标头作为优化。如果 Backpack.h 已完全加载,则不会发生此错误。

于 2013-04-29T12:16:30.810 回答
1

很可能 Pack 是未定义的。但是存在一个可能定义它的标题,所以......它是在另一个命名空间中定义的吗?(您可能需要使用显式命名空间定位器,例如 pack_namespace::Pack partyPack; )

于 2013-04-26T21:37:11.473 回答