Почему я не могу передать - объявляют класс в пространстве имен с помощью двойных двоеточий?

class Namespace::Class;

Почему я должен сделать это?:

namespace Namespace {
    class Class;
}

Используя VC ++ 8.0, проблемы компилятора:

ошибка C2653: 'Пространство имен': не имя пространства имен или класс

Я предполагаю, что проблема здесь состоит в том, что компилятор не может сказать ли Namespace класс или пространство имен? Но почему это имеет значение, так как это - просто предописание?

Там другой путь состоит в том, чтобы передать - объявляют класс, определенный в некотором пространстве имен? Синтаксис выше чувствует, что я "вновь открыл" пространство имен и расширяю его определение. Что, если Class не были на самом деле определены в Namespace? Это привело бы к ошибке в какой-то момент?

161
задан Yong Li 12 December 2017 в 18:29
поделиться

3 ответа

, поскольку вы не можете. В C++ язык полностью определил имена, только используются для обращения к существующий (т.е. ранее объявляются), сущности. Они не могут использоваться для представления новый сущности.

И вы на самом деле "повторное открытие" пространства имен для объявления новых сущностей. Если класс Класс позже определяется как член другого пространства имен - это - совершенно другой класс, который не имеет никакого отношения к тому, который вы объявили здесь.

, После того как вы переходите к сути дела определение предзаявленный класс, вы не должны "вновь открыть" пространство имен снова. Можно определить его в глобальном пространстве имен (или любое пространство имен, включающее ваш Пространство имен ) как

class Namespace::Class {
  /* whatever */
};

, Так как вы обращаетесь к сущности, которая была уже объявлена в Пространстве имен пространства имен , можно использовать Пространство имен полностью определенного имени :: Класс .

83
ответ дан 23 November 2019 в 21:26
поделиться
- [1119994-

Вы получаете правильные ответы, позвольте мне просто попробовать повторную формулировку:

класс пространства имен класса :: класс;

Почему я должен сделать это?

У вас есть Для этого, потому что термин пространство имен :: класс говорит компилятору:

... OK, компилятор. Иди найти пространство имен по имени пространство имен и внутри которые относятся к классу именованного класса.

Но компилятор не знает, о чем вы говорите, потому что он не знает никакого пространства имен имени пространство имен . Даже если было пространство имен имени пространство имен , как в:

namespace Namespace
{
};

class Namespace::Class;

Это все равно не будет работать, потому что вы не можете объявить класс в пространстве имен из-за этого пространства имен. Вы должны быть в пространстве имен.

Итак, на самом деле вы можете объявить класс в пространстве имен. Просто сделай это:

namespace Namespace
{
    class Class;
};
196
ответ дан 23 November 2019 в 21:26
поделиться

Я полагаю, что по той же причине вы не можете объявить вложенные пространства имен за один раз так:

namespace Company::Communications::Sockets {
}

и вы должны сделать это:

namespace Company {
  namespace Communications {
    namespace Sockets {
    }
  }
}
22
ответ дан 23 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: