Compartir a través de


Error del compilador C2653

'identificador': no es un nombre de clase o espacio de nombres

La sintaxis del lenguaje requiere aquí un nombre de clase, estructura, unión o espacio de nombres.

Este error puede producirse cuando se usa un nombre que no se ha declarado como clase, estructura, unión o espacio de nombres delante de un operador de ámbito. Para corregir este problema, declare el nombre o incluya el encabezado que declara el nombre antes de que se utilice.

El error C2653 se puede producir también si intenta definir un espacio de nombres compuesto, es decir, un espacio de nombres que contiene uno o varios nombres de espacio de nombres anidados por ámbito. No se permiten definiciones de espacio de nombres compuesto en C++ antes de C++17. Los espacios de nombres compuestos se admiten en Visual Studio 2015 Update 3 cuando se especifica la opción /std:c++latest del compilador. A partir de la versión 15.5 de Visual Studio 2017, el compilador admite definiciones de espacios de nombres compuestos cuando se especifica la opción [/std:c++17](../../build/reference/std-specify-language-standard-version.md) o una posterior.

Ejemplos

Este ejemplo genera el error C2653 porque se usa un nombre de ámbito, pero no se declara. El compilador espera un nombre de clase, estructura, unión o espacio de nombres delante de un operador de ámbito (::).

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

En el código que no se compila para el estándar C++17 o versiones posteriores, los espacios de nombres anidados deben usar una declaración de espacio de nombres explícita en cada nivel de anidamiento:

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