Объем DataType объявлен в пространстве имен - PullRequest
0 голосов
/ 11 августа 2011

Sample.h

namespace Testing
{
    enum Type
    {
        DATA = 0,
        MORE_DATA
    };
}

Теперь в Sample2.h, используя то же пространство имен, можно ли получить доступ к DataType, определенному в Sample.h, без его включения?

namespace Testing
{
    Type test;
}

Вопрос возник, потому что у меня есть файлы, которые реализуют это и, кажется, создают без проблем.Другой пользователь пытается собрать, но сообщает, что ему нужно #include "Sample.h" в Sample2.h для сборки.

Ответы [ 3 ]

1 голос
/ 11 августа 2011

Скорее всего, файлы создаются, потому что некоторые ранее включенные файлы включают в себя Sample.h для вас.Если ранее включаемый файл не указан (или перемещен после Sample2.h), файлы больше не будут компилироваться.

1 голос
/ 11 августа 2011

Прямые объявления enum не поддерживаются в большинстве современных компиляторов. Это запланированная особенность грядущего C ++ 0x. Вы можете создавать указатели для типа , вероятно , но не можете создавать экземпляры, это также совместимо с другими типами (структурами и классами).

Ой, мой плохой, я понял, что это неправильно, я думаю. Во всяком случае, прочитайте другие и прочитайте это также. Заголовки не компилируются отдельно. Поэтому, если вы не включили в заголовок необходимый заголовок и включили его в файл cpp, вы не столкнетесь с какими-либо ошибками. Пока все файлы cpp содержат оба заголовка с требуемым порядком, проблем не будет вообще. Однако это не очень хорошая идея, лучше всего включить в заголовок любые необходимые файлы и использовать средства защиты заголовков, чтобы они не добавлялись дважды. Я надеюсь, что это имеет смысл.

0 голосов
/ 11 августа 2011

Да, вам нужно будет включить Sample.h в Sample2.h.Определение Type невидимо для компилятора в Sample2.h просто потому, что имя пространства имен одинаково в двух файлах.

Единственное, что вы получаете, имея одинаковые имена пространств имен в 2 файлах, это то, что Type не нужно явно указывать пространство имен в Sample2.h.Например, если 2 пространства имен не совпадают:

Sample.h

namespace Testing
{
    enum Type
    {
        DATA = 0,
        MORE_DATA
    };
}

Sample2.h

#include "Sample.h"

namespace Testing1
{
    Testing::Type test;
}
...