Erro do compilador C2653
'identificador': não é um nome de classe ou de namespace
A sintaxe da linguagem de programação exige um nome de classe, estrutura, união ou namespace aqui.
Esse erro pode ocorrer quando você usa um nome que não foi declarado como uma classe, estrutura, união ou namespace na frente de um operador de escopo. Para corrigir esse problema, declare o nome ou inclua o cabeçalho que declara o nome antes de ele ser usado.
O erro C2653 também poderá ocorrer se você tentar definir um namespace composto, um namespace que contém um ou mais nomes de namespace aninhados no escopo. Definições de namespace compostas não são permitidas em C++ anterior ao C++17. Os namespaces compostos são compatíveis com as versões do Visual Studio começando com o Visual Studio 2015 Atualização 3 quando você especifica a opção do compilador /std:c++latest
. No Visual Studio 2017 versão 15.5 e posteriores, o compilador dá suporte a definições de namespace compostas quando a opção [/std:c++17
](../../build/reference/std-specify-language-standard-version.md) ou posterior é especificada.
Exemplos
Este exemplo gera C2653 porque um nome de escopo é usado, mas não declarado. O compilador espera um nome de classe, estrutura, união ou namespace antes de um operador de escopo (::).
// C2653.cpp
// compile with: /c
class yy {
void func1(int i);
};
void xx::func1(int m) {} // C2653, xx is not declared
void yy::func1(int m) {} // OK
No código que não é compilado para padrões C++17 ou posteriores, namespaces aninhados precisam usar uma declaração de namespace explícita em cada nível de aninhamento:
// C2653b.cpp
namespace a::b {int i;} // C2653 prior to Visual Studio 2015 Update 3,
// C2429 thereafter. Use /std:c++17 or /std:c++latest to fix.
namespace a { // Use this form for conformant code under /std:c++14 (the default)
namespace b { // or when using compilers before Visual Studio 2015 update 3.
int i;
}
}
int main() {
a::b::i = 2;
}