Udostępnij za pomocą


Błąd kompilatora C2653

"identifier" : nie jest nazwą klasy ani przestrzeni nazw

Uwagi

Składnia języka wymaga tutaj nazwy klasy, struktury, unii lub przestrzeni nazw.

Ten błąd może wystąpić, gdy używasz nazwy, która nie została zadeklarowana jako klasa, struktura, unia lub przestrzeń nazw przed operatorem zakresu. Aby rozwiązać ten problem, zadeklaruj nazwę lub dołącz nagłówek, który deklaruje nazwę przed jego zastosowaniem.

C2653 jest również możliwe, jeśli spróbujesz zdefiniować złożoną przestrzeń nazw, przestrzeń nazw zawierającą jedną lub więcej nazw zagnieżdżonych w zakresie. Definicje przestrzeni nazw złożonych nie są dozwolone w języku C++ przed C++17. Złożone przestrzenie nazw są obsługiwane począwszy od programu Visual Studio 2015 Update 3 podczas określania opcji kompilatora /std:c++latest . Począwszy od programu Visual Studio 2017 w wersji 15.5, kompilator obsługuje złożone definicje przestrzeni nazw, gdy określono opcję /std:c++17 lub nowszą.

Przykłady

W tym przykładzie jest generowany kod C2653, ponieważ nazwa zakresu jest używana, ale nie jest zadeklarowana. Kompilator oczekuje nazwy klasy, struktury, unii lub przestrzeni nazw przed operatorem zakresu (::).

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

W kodzie, który nie jest kompilowany dla standardów C++17 lub nowszych, zagnieżdżone przestrzenie nazw muszą używać jawnej deklaracji przestrzeni nazw na każdym poziomie zagnieżdżania:

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