0

機能的に同一のヘッダーファイルが2つあり、そのうちの1つは認識できる理由もなくエラーを生成します。新しい(壊れた)ファイルを作成する際に何か間違ったことをしたに違いありませんが、何がわからないのです。

私のIDEはXcodeです。プロジェクトはAppleLLVMコンパイラ4.1を使用してObjectiveC++用にコンパイルされていますが、問題のコードのセクションはすべて純粋なC ++であり、ObjectiveCではありません。

ここにいくつかのコードがあります:

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

ありがとうございました。

4

2 に答える 2

1

コードで参照する名前空間とクラスを含むすべてのファイルを含める必要があります。したがって、で参照NamespaceB::SuperclassするためBrokenClass.h、それを宣言するファイルを必ず含める必要があります。この場合、NamespaceA.Common.hインクルードするファイルがインクルードされているため、インクルードは(うまくいけば)この問題を解決しますNamespaceB

NamespaceA.Common.hWorkingClass.hに含める必要がない理由については、たまたま別の場所に含めたためだと思い../NamespaceB/Common.hます。

于 2012-10-26T02:23:08.073 に答える
0

問題を見つけました。ヘッダーに共通ファイルを含めてからcppに独自のヘッダーファイルを含めるのではなく、独自のヘッダーファイルをWorkingClass.cpp含めたり含めなかったりしていました。NamespaceA.Common.h

含まれているだけで、含まれていないと思ったので、なんとか#includeインを逃しました。WorkingClass.cppWorkingClass.hNamespaceA.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?

私はこのインクルードスキームの大ファンではありませんが、これは大規模なプロジェクトであり、大幅な変更を加えたくないので、一緒に住んでいます。

于 2012-10-26T02:41:04.510 に答える