Delen via


Compilerfout C2653

'id': is geen klasse- of naamruimtenaam

Opmerkingen

Voor de taalsyntaxis is hier een klasse-, structuur-, samenvoeg- of naamruimtenaam vereist.

Deze fout kan optreden wanneer u een naam gebruikt die niet is gedeclareerd als een klasse, structuur, samenvoeging of naamruimte voor een bereikoperator. U kunt dit probleem oplossen door de naam te declareren of de header op te nemen die de naam declareert voordat deze wordt gebruikt.

C2653 is ook mogelijk als u probeert een samengestelde naamruimte te definiëren, een naamruimte die een of meer bereik-geneste naamruimtenamen bevat. Samengestelde naamruimtedefinities zijn niet toegestaan in C++ vóór C++17. Samengestelde naamruimten worden ondersteund vanaf Visual Studio 2015 Update 3 wanneer u de /std:c++latest compileroptie opgeeft. Vanaf Visual Studio 2017 versie 15.5 ondersteunt de compiler samengestelde naamruimtedefinities wanneer de /std:c++17 optie of hoger is opgegeven.

Voorbeelden

In dit voorbeeld wordt C2653 gegenereerd omdat een bereiknaam wordt gebruikt, maar niet gedeclareerd. De compiler verwacht een klasse-, structuur-, samenvoeg- of naamruimtenaam vóór een bereikoperator (::).

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

In code die niet is gecompileerd voor C++17- of hogerstandaarden, moeten geneste naamruimten een expliciete naamruimtedeclaratie op elk nestniveau gebruiken:

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