class Namespace::Class;
Por que eu tenho que fazer isso ?:
namespace Namespace {
class Class;
}
Usando o VC ++ 8.0, o compilador emite:
erro C2653: 'Namespace': não é um nome de classe ou namespace
Presumo que o problema aqui é que o compilador não pode dizer se Namespace
é uma classe ou um espaço para nome? Mas por que isso importa, pois é apenas uma declaração direta?
Existe outra maneira de declarar adiante uma classe definida em algum espaço para nome? A sintaxe acima parece que estou "reabrindo" o espaço para nome e estendendo sua definição. E se Class
não foram realmente definidos Namespace
? Isso resultaria em um erro em algum momento?
c++
namespaces
Yong Li
fonte
fonte
A::B
aA
é um identificador namespace em vez de um nome de classe?Namespace
é uma classe ou um espaço para nome. Apenas não chegue nem perto da sugestão de uma possibilidade concebível de iniciar uma guerra de linguagem por causa da sintaxe.Respostas:
Porque você não pode. Na linguagem C ++, nomes totalmente qualificados são usados apenas para se referir a entidades existentes (isto é, declaradas anteriormente). Eles não podem ser usados para introduzir novas entidades.
E você está de fato "reabrindo" o espaço para nome para declarar novas entidades. Se a classe
Class
for definida posteriormente como membro de um espaço para nome diferente - é uma classe completamente diferente que não tem nada a ver com a que você declarou aqui.Quando você chega ao ponto de definir a classe pré-declarada, não precisa "reabrir" o espaço para nome novamente. Você pode defini-lo no espaço para nome global (ou qualquer espaço para nome que inclua o seu
Namespace
) comoComo você está se referindo a uma entidade que já foi declarada no espaço para nome
Namespace
, você pode usar o nome qualificadoNamespace::Class
.fonte
Você está obtendo respostas corretas, deixe-me tentar reformular:
class Namespace::Class;
Você precisa fazer isso porque o termo
Namespace::Class
está dizendo ao compilador:Mas o compilador não sabe do que está falando, porque não conhece nenhum espaço para nome nomeado
Namespace
. Mesmo se houvesse um espaço para nome nomeadoNamespace
, como em:ainda não funcionaria, porque você não pode declarar uma classe dentro de um espaço para nome de fora desse espaço para nome. Você precisa estar no espaço para nome.
Portanto, você pode, de fato, encaminhar declarar uma classe dentro de um espaço para nome. Apenas faça o seguinte:
fonte
Suponho que seja pelo mesmo motivo que você não pode declarar namespaces aninhados de uma só vez, como este:
e você tem que fazer isso:
fonte
Não ficaria claro o que realmente é o tipo de uma variável declarada a frente. A declaração de encaminhamento
class Namespace::Class;
pode significarou
fonte
Há muitas respostas excelentes sobre o raciocínio envolvido em impedi-lo. Eu só quero fornecer a cláusula padrão chata que a proíbe especificamente. Isso vale para C ++ 17 (n4659).
O parágrafo em questão é [class.name] / 2 :
O acima define o que constitui uma declaração direta (ou redefinição de uma classe). Essencialmente, deve ser um de
class identifier;
,struct identifier;
ouunion identifier;
onde identifer é a definição lexical comum em [lex.name] :Qual é a produção do esquema comum com o
[a-zA-Z_][a-zA-Z0-9_]*
qual todos estamos familiarizados. Como você pode ver, isso impede queclass foo::bar;
seja uma declaração direta válida, porquefoo::bar
não é um identificador. É um nome totalmente qualificado, algo diferente.fonte