Erreur du compilateur C2653
'identifier' : n’est pas un nom de classe ou d’espace de noms
La syntaxe du langage nécessite ici un nom de classe, de structure, d’union ou d’espace de noms.
Cette erreur peut se produire lorsque vous utilisez un nom qui n’a pas été déclaré en tant que classe, structure, union ou espace de noms devant un opérateur d’étendue. Pour résoudre ce problème, déclarez le nom ou incluez l’en-tête qui déclare le nom avant d’être utilisé.
C2653 est également possible si vous essayez de définir un espace de noms composé, un espace de noms qui contient un ou plusieurs noms d’espaces de noms imbriqués dans l’étendue. Les définitions d’espace de noms composées ne sont pas autorisées en C++ avant C++17. Les espaces de noms composés sont pris en charge à partir de Visual Studio 2015 Update 3 lorsque vous spécifiez l’option du /std:c++latest
compilateur. À compter de Visual Studio 2017 version 15.5, le compilateur prend en charge les définitions d’espaces de noms composés lorsque le [/std:c++17
](.. /.. L’option /build/reference/std-specify-language-standard-version.md) ou ultérieure est spécifiée.
Exemples
Cet exemple génère l’erreur C2653, car un nom d’étendue est utilisé, mais non déclaré. Le compilateur attend une classe, une structure, une union ou un nom d’espace de noms avant un opérateur d’étendue ( ::).
// 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
Dans le code qui n’est pas compilé pour les normes C++17 ou ultérieures, les espaces de noms imbriqués doivent utiliser une déclaration d’espace de noms explicite à chaque niveau d’imbrication :
// 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;
}