Kompilatorfel C2653

"identifierare" : är inte ett klass- eller namnområdesnamn

Anmärkningar

Språksyntaxen kräver ett namn på klass, struktur, union eller namnområde här.

Det här felet kan inträffa när du använder ett namn som inte har deklarerats som en klass, struktur, union eller namnrymd framför en omfångsoperator. Åtgärda problemet genom att deklarera namnet eller inkludera rubriken som deklarerar namnet innan det används.

C2653 är också möjligt om du försöker definiera ett sammansatt namnområde, ett namnområde som innehåller ett eller flera namnområden inbäddade inom olika omfång. Sammansatta namnområdesdefinitioner tillåts inte i C++ före C++17. Sammansatta namnområden stöds från och med Visual Studio 2015 Update 3 när du anger kompilatoralternativet /std:c++latest . Från och med Visual Studio 2017 version 15.5 stöder kompilatorn sammansatta namnområdesdefinitioner när /std:c++17 alternativet eller senare anges.

Exempel

Det här exemplet genererar C2653 eftersom ett omfångsnamn används men inte deklareras. Kompilatorn förväntar sig ett namn på klass, struktur, union eller namnområde före en omfångsoperator (::).

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

I kod som inte kompileras för C++17 eller senare standarder måste kapslade namnområden använda en explicit namnområdesdeklaration på varje kapslingsnivå:

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