Ошибка компилятора C2653
"идентификатор" : не является именем класса или пространства имен
Для синтаксиса языка требуется имя класса, структуры, объединения или пространства имен.
Эта ошибка может возникать, если вы используете имя, которое не было объявлено как класс, структура, объединение или пространство имен перед оператором области. Чтобы устранить эту проблему, объявите имя или добавьте заголовок, объявляющий имя перед его использованием.
C2653 также возможно, если вы пытаетесь определить составное пространство имен, пространство имен, содержащее одно или несколько имен вложенного пространства имен. Определения составного пространства имен не допускаются в C++ до C++17. Составные пространства имен поддерживаются начиная с Visual Studio 2015 с обновлением 3 при указании параметра компилятора /std:c++latest
. Начиная с Visual Studio 2017 версии 15.5 компилятор поддерживает составные определения пространства имен, если [/std:c++17
значение ](.). /.. Указан параметр /build/reference/std-specify-language-standard-version.md) или более поздней версии.
Примеры
Этот пример создает C2653, так как имя области используется, но не объявлено. Компилятор ожидает имя класса, структуры, объединения или пространства имен перед оператором области (::).
// 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
В коде, который не компилируется для стандартов C++17 или более поздней версии, вложенные пространства имен должны использовать явное объявление пространства имен на каждом уровне вложения:
// 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;
}