编译器错误 C2653

identifier”:不是类或命名空间名称

语言语法在此处需要类、结构、联合或命名空间名称。

使用尚未在作用域运算符前面声明为类、结构、联合或命名空间的名称时,可能会出现此错误。 若要解决此问题,请在使用之前声明名称或包含声明名称的标头。

如果尝试定义复合命名空间(包含一个或多个作用域嵌套命名空间名称的命名空间),也可使用 C2653。 在 C++17 之前,C++ 不允许使用复合命名空间定义。 指定 /std:c++latest 编译器选项时,Visual Studio 2015 Update 3 支持复合命名空间。 从 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;
}