Megosztás a következőn keresztül:


C2653 fordítási hiba

"azonosító": nem osztály- vagy névtérnév

Megjegyzések

A nyelv szintaxisához itt osztály-, struktúra-, egyesítő- vagy névtérnevet kell megadni.

Ez a hiba akkor fordulhat elő, ha olyan nevet használ, amelyet nem deklaráltak osztályként, struktúráként, egyesítőként vagy névtérként egy hatókör-operátor előtt. A probléma megoldásához deklarálja a nevet, vagy adja meg a nevet deklaráló fejlécet a használat előtt.

A C2653 akkor is lehetséges, ha összetett névteret próbál definiálni, amely egy vagy több hatókörbe ágyazott névtérnevet tartalmaz. Az összetett névtérdefiníciók a C+++17 előtt nem engedélyezettek a C+++-ban. Az összetett névterek a Visual Studio 2015 3. frissítésétől kezdve támogatottak a /std:c++latest fordítóbeállítás megadásakor. A Visual Studio 2017 15.5-ös verziójától kezdve a fordító támogatja az összetett névtérdefiníciókat, ha meg van adva a /std:c++17 vagy újabb beállítás.

Példák

Ez a példa c2653-at hoz létre, mert a rendszer egy hatókörnevet használ, de nincs deklarálva. A fordító osztály-, struktúra-, egyesítő- vagy névtérnevet vár a hatókör-operátor (::)) előtt.

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

A C++17 vagy újabb szabványokhoz nem lefordított kódban a beágyazott névtereknek minden beágyazási szinten explicit névtérdeklarációt kell használniuk:

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