コンパイラ エラー C2653
'identifier' : クラス名でも名前空間名でもありません
言語構文には、ここでクラス、構造体、共用体、または名前空間の名前が必要です。
このエラーは、スコープ演算子の前でクラス、構造体、共用体、または名前空間として宣言されていない名前を使用すると発生する可能性があります。 この問題を解決するには、名前を宣言するか、使用する前に名前を宣言するヘッダーを含める必要があります。
C2653 は、1 つ以上のスコープ入れ子になった名前空間名を含む名前空間である、複合名前空間を定義する場合にもあり得ます。 C++ 17 より前の C++ では、複合名前空間の定義は許可されていません。 複合名前空間は、Visual Studio 2015 Update 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;
}