class Namespace::Class;
Почему я должен сделать это?:
namespace Namespace {
class Class;
}
Используя VC ++ 8.0, проблемы компилятора:
ошибка C2653: 'Пространство имен': не имя пространства имен или класс
Я предполагаю, что проблема здесь состоит в том, что компилятор не может сказать ли Namespace
класс или пространство имен? Но почему это имеет значение, так как это - просто предописание?
Там другой путь состоит в том, чтобы передать - объявляют класс, определенный в некотором пространстве имен? Синтаксис выше чувствует, что я "вновь открыл" пространство имен и расширяю его определение. Что, если Class
не были на самом деле определены в Namespace
? Это привело бы к ошибке в какой-то момент?
, поскольку вы не можете. В C++ язык полностью определил имена, только используются для обращения к существующий (т.е. ранее объявляются), сущности. Они не могут использоваться для представления новый сущности.
И вы на самом деле "повторное открытие" пространства имен для объявления новых сущностей. Если класс Класс
позже определяется как член другого пространства имен - это - совершенно другой класс, который не имеет никакого отношения к тому, который вы объявили здесь.
, После того как вы переходите к сути дела определение предзаявленный класс, вы не должны "вновь открыть" пространство имен снова. Можно определить его в глобальном пространстве имен (или любое пространство имен, включающее ваш Пространство имен
) как
class Namespace::Class {
/* whatever */
};
, Так как вы обращаетесь к сущности, которая была уже объявлена в Пространстве имен пространства имен , можно использовать Пространство имен полностью определенного имени
:: Класс
.
Вы получаете правильные ответы, позвольте мне просто попробовать повторную формулировку:
класс пространства имен класса :: класс;
Почему я должен сделать это?
У вас есть Для этого, потому что термин пространство имен :: класс
говорит компилятору:
... OK, компилятор. Иди найти пространство имен по имени пространство имен и внутри которые относятся к классу именованного класса.
Но компилятор не знает, о чем вы говорите, потому что он не знает никакого пространства имен имени
пространство имен
. Даже если было пространство имен имени пространство имен
, как в:
namespace Namespace
{
};
class Namespace::Class;
Это все равно не будет работать, потому что вы не можете объявить класс в пространстве имен из-за этого пространства имен. Вы должны быть в пространстве имен.
Итак, на самом деле вы можете объявить класс в пространстве имен. Просто сделай это:
namespace Namespace
{
class Class;
};
Я полагаю, что по той же причине вы не можете объявить вложенные пространства имен за один раз так:
namespace Company::Communications::Sockets {
}
и вы должны сделать это:
namespace Company {
namespace Communications {
namespace Sockets {
}
}
}