2013-04-25 80 views
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中注释第30行//包partyPack,编译/启动调试(失败),取消注释同一行并重试,它运行正好。

更新3 在学习了Pack()编译指示后,我用Pack取代了Pack,但问题依然存在。

正如其他人提到的,它似乎有干扰党的定义的东西,但我找不到它是什么。

+2

使用两个编辑器,让你的IDE没有意识到它需要重新保存一个文件可能会导致... – 2013-04-25 23:52:47

+2

这是所谓的Heisenbug的一个化身:-) – paxdiablo 2013-04-25 23:54:03

+0

@paxdiablo Heh。因为它似乎与我试图修复这个弹出的另一个错误有关。这很难说出我的真实故障在哪里。 – 2013-04-25 23:55:25

回答

2

(在以后的版本中,包已更名为背包这个答案使用“背包”到位“包”的。)

当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,但在第5行中的背包.h,背包类尚未定义。 Party.h在其第5行包含Backpack.h,但自Backpack。h已经包含在内,#ifndef语句可以防止Backpack.h第二次被包含(否则会产生#include语句的无限循环)。

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

在为什么这是片状的,我猜测,VC缓存完全加载标题作为优化。如果Backpack.h已经完全加载,那么这个错误不会发生。

+0

先生,你是我的英雄。 – 2013-04-29 15:25:38

1

最有可能的包是未定义的。但是有一个可能定义它的头文件,所以...是否在另一个命名空间中定义? (您可能需要使用明确的命名空间定位像pack_namespace ::包partyPack;)

+0

我只使用声明,没有指令,所以我不知道它可能是什么名称空间,而不是Pack.h中定义的名称空间... – 2013-04-28 05:00:20

+0

Er ...声明在.h中,在pack.cpp中定义 – 2013-04-28 17:37:05