Condividi tramite


Errore del compilatore C2653

'identifier': non è un nome di classe o spazio dei nomi

Osservazioni:

La sintassi del linguaggio richiede qui una classe, una struttura, un'unione o un nome dello spazio dei nomi.

Questo errore può verificarsi quando si usa un nome che non è stato dichiarato come classe, struttura, unione o spazio dei nomi davanti a un operatore di ambito. Per risolvere questo problema, dichiarare il nome o includere l'intestazione che dichiara il nome prima che venga usato.

C2653 è anche possibile se si tenta di definire uno spazio dei nomi composto, uno spazio dei nomi contenente uno o più nomi di spazi dei nomi annidati dall'ambito. Le definizioni di spazio dei nomi composte non sono consentite in C++ prima di C++17. Gli spazi dei nomi composti sono supportati a partire da Visual Studio 2015 Update 3 quando si specifica l'opzione del /std:c++latest compilatore. A partire da Visual Studio 2017 versione 15.5, il compilatore supporta le definizioni di spazio dei nomi composte quando viene specificata l'opzione /std:c++17 o successiva.

Esempi

Questo esempio genera l'errore C2653 perché viene usato un nome di ambito ma non dichiarato. Il compilatore prevede un nome di classe, struttura, unione o spazio dei nomi prima di un operatore di ambito (::).

// 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

Nel codice non compilato per gli standard C++17 o versioni successive, gli spazi dei nomi annidati devono usare una dichiarazione di spazio dei nomi esplicita a ogni livello di annidamento:

// 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;
}