没有包含的其他命名空间中的对象,其他文件相同

时间:2012-10-26 02:13:50

标签: c++ include llvm objective-c++

我有两个功能相同的头文件,其中一个产生错误,没有明显的原因。我一定在创建新(破碎)文件时做错了什么,但我无法弄清楚是什么。

我的IDE是Xcode。该项目是使用Apple LLVM Compiler 4.1为Objective C ++编译的,但所讨论的代码部分都是纯C ++,没有Objective C.。

以下是一些代码:

NamespaceA.Common.h

#include "../NamespaceB/Common.h"

#include "WorkingClass.h"
#include "BrokenClass.h"

...

../ NamespaceB / COMMON.H

#ifndef NamespaceBCommon
#define NamespaceBCommon

namespace NamespaceB
{
    ...
}

...
#include "Superclass.h"
...

WorkingClass.h

#ifndef NamespaceA_WorkingClass
#define NamespaceA_WorkingClass

namespace NamespaceA
{
    class WorkingClass : public NamespaceB::Superclass
    {
    public:

        WorkingClass();
        ~WorkingClass();
    };
}

#endif

BrokenClass.h

#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

谢谢。

2 个答案:

答案 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

简而言之:

WorkingClass.h

// Class goes here
// No includes

WorkingClass.cpp

// Notice it does not include WorkingClass.h for whatever reason
#include "NamespaceA.Common.h"

NamespaceA.Common.h

#include "../NamespaceB/Common.h"

#include "WorkingClass.h"
#include "BrokenClass.h"
#include "EveryOtherClass.h" ...

BrokenClass.h

// Class goes here
// No includes

BrokenClass.cpp

#include "BrokenClass.h"
// Oh no! Where's NamespaceA.Common.h?

我不是这个包含计划的忠实粉丝,但我会忍受它,因为这是一个我不想做出彻底改变的大型项目。