У меня есть два функционально идентичных заголовочных файла, один из которых выдает ошибки без видимой причины. Должно быть, я сделал что-то не так при создании нового (сломанного) файла, но не могу понять, что именно.
Моя IDE это Xcode. Проект скомпилирован для Objective C ++ с использованием Apple LLVM Compiler 4.1, но весь рассматриваемый раздел кода — чистый 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
Спасибо.
Вы должны включить все файлы, которые включают пространства имен и классы, на которые вы ссылаетесь, в своем коде. Итак, потому что вы ссылка NamespaceB::Superclass
в вашем BrokenClass.h
Вы должны обязательно включить файл, который объявляет это. В этом случае, в том числе NamespaceA.Common.h
(надеюсь) решает эту проблему, потому что он включает в себя файл, где NamespaceB
Включено.
Что касается того, почему вы не должны включать NamespaceA.Common.h
в вашем WorkingClass.h, я подозреваю, это потому, что у вас ../NamespaceB/Common.h
включено где-то еще.
Я нашел проблему. 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?
Я не большой поклонник этой схемы включения, но я буду жить с ней, поскольку это большой проект, в который я не хочу вносить радикальные изменения.