Объекты в другом пространстве имен не найдены без include, файлы в остальном идентичны

У меня есть два функционально идентичных заголовочных файла, один из которых выдает ошибки без видимой причины. Должно быть, я сделал что-то не так при создании нового (сломанного) файла, но не могу понять, что именно.

Моя 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

Спасибо.

0

Решение

Вы должны включить все файлы, которые включают пространства имен и классы, на которые вы ссылаетесь, в своем коде. Итак, потому что вы ссылка NamespaceB::Superclass в вашем BrokenClass.hВы должны обязательно включить файл, который объявляет это. В этом случае, в том числе NamespaceA.Common.h (надеюсь) решает эту проблему, потому что он включает в себя файл, где NamespaceB Включено.

Что касается того, почему вы не должны включать NamespaceA.Common.h в вашем WorkingClass.h, я подозреваю, это потому, что у вас ../NamespaceB/Common.h включено где-то еще.

1

Другие решения

Я нашел проблему. 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?

Я не большой поклонник этой схемы включения, но я буду жить с ней, поскольку это большой проект, в который я не хочу вносить радикальные изменения.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector