我有两个功能相同的头文件,其中一个产生错误,没有明显的原因。我一定在创建新(破碎)文件时做错了什么,但我无法弄清楚是什么。
我的IDE是Xcode。该项目是使用Apple LLVM Compiler 4.1为Objective C ++编译的,但所讨论的代码部分都是纯C ++,没有Objective C.。
以下是一些代码:
#include "../NamespaceB/Common.h"
#include "WorkingClass.h"
#include "BrokenClass.h"
...
#ifndef NamespaceBCommon
#define NamespaceBCommon
namespace NamespaceB
{
...
}
...
#include "Superclass.h"
...
#ifndef NamespaceA_WorkingClass
#define NamespaceA_WorkingClass
namespace NamespaceA
{
class WorkingClass : public NamespaceB::Superclass
{
public:
WorkingClass();
~WorkingClass();
};
}
#endif
#ifndef NamespaceA_BrokenClass
#define NamespaceA_BrokenClass
// If I don't have this line I get errors. Why?? !!!!!
// This file is exactly identical to WorkingClass.h
// as far as I can tell!
//#include NamespaceA.Common.h
namespace NamespaceA
{
// Parse Issue: Expected class name !!!!!
// Semantic Issue: Use of undeclared identifier 'NamespaceB'
class BrokenClass : public NamespaceB::Superclass
{
public:
BrokenClass();
~BrokenClass();
};
}
#endif
谢谢。
答案 0 :(得分:1)
您需要包含所有包含您在代码中引用的命名空间和类的文件。因此,因为您在NamespaceB::Superclass
中引用了BrokenClass.h
,所以您需要确保包含声明该文件的文件。在这种情况下,包括NamespaceA.Common.h
(希望)解决了这个问题,因为它包含了包含NamespaceB
的文件。
至于为什么你不必在你的WorkingClass.h中包含NamespaceA.Common.h
,我怀疑是因为你恰好将../NamespaceB/Common.h
包含在其他地方。
答案 1 :(得分:0)
我发现了问题。 WorkingClass.cpp
包括NamespaceA.Common.h
,不包括自己的头文件,而不是在头文件中包含公共文件,然后在cpp中包含自己的头文件。
我设法错过了#include
中的WorkingClass.cpp
因为我认为它只包括WorkingClass.h
而不是NamespaceA.Common.h
。
简而言之:
// Class goes here
// No includes
// Notice it does not include WorkingClass.h for whatever reason
#include "NamespaceA.Common.h"
#include "../NamespaceB/Common.h"
#include "WorkingClass.h"
#include "BrokenClass.h"
#include "EveryOtherClass.h" ...
// Class goes here
// No includes
#include "BrokenClass.h"
// Oh no! Where's NamespaceA.Common.h?
我不是这个包含计划的忠实粉丝,但我会忍受它,因为这是一个我不想做出彻底改变的大型项目。