Freigeben über


Compilerfehler C2653

'Identifier': ist kein Klassen- oder Namespacename.

Für die Sprachsyntax ist hier ein Klassen-, Struktur-, Vereinigungs- oder Namespacename erforderlich.

Dieser Fehler kann auftreten, wenn Sie einen Namen verwenden, der nicht als Klasse, Struktur, Union oder Namespace vor einem Bereichsoperator deklariert wurde. Um dieses Problem zu beheben, deklarieren Sie den Namen, oder schließen Sie den Header ein, der den Namen deklariert, bevor es verwendet wird.

C2653 ist auch möglich, wenn Sie versuchen, einen zusammengesetzten Namespace zu definieren, einen Namespace, der einen oder mehrere bereichsverschachtelte Namespacenamen enthält. Zusammengesetzte Namespacedefinitionen sind in C++ vor C++17 nicht zulässig. Zusammengesetzte Namespaces werden ab Visual Studio 2015 Update 3 unterstützt, wenn Sie die /std:c++latest Compileroption angeben. Ab Visual Studio 2017 Version 15.5 unterstützt der Compiler zusammengesetzte Namespacedefinitionen, wenn die Option /std:c++17 oder eine spätere angegeben wird.

Beispiele

In diesem Beispiel wird C2653 generiert, da ein Bereichsname verwendet, aber nicht deklariert wird. Der Compiler erwartet einen Klassen-, Struktur-, Union- oder Namespacenamen vor einem Bereichsoperator (::)).

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

In Code, der nicht für C++17- oder höher-Standards kompiliert wird, müssen geschachtelte Namespaces eine explizite Namespacedeklaration auf jeder Schachtelungsebene verwenden:

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