Compilerfehler C2146

Syntaxfehler: Fehlendes 'Token' vor dem Bezeichner 'Identifier'

Der Compiler erwartete token und wurde stattdessen gefunden identifier . Mögliche Ursachen:

  1. Rechtschreib- oder Großschreibungsfehler.

  2. Fehlender Typbezeichner in der Deklaration des Bezeichners.

Dieser Fehler kann durch einen typografischen Fehler verursacht werden. Fehler C2065 steht in der Regel vor diesem Fehler.

Beispiele

Im folgenden Beispiel wird C2146 generiert.

// C2146.cpp
class CDeclaredClass {};

class CMyClass {
   CUndeclared m_myClass;   // C2146
   CDeclaredClass m_myClass2;   // OK
};

int main() {
   int x;
   int t x;   // C2146 : missing semicolon before 'x'
}

Dieser Fehler kann auch als Ergebnis der Compilerkonformität generiert werden, die für Visual Studio .NET 2003 ausgeführt wurde: fehlende typename Schlüsselwort (keyword).

Das folgende Beispiel kompiliert in Visual Studio .NET 2002, schlägt jedoch in Visual Studio .NET 2003 fehl:

// C2146b.cpp
// compile with: /c
template <typename T>
struct X {
   struct Y {
      int i;
   };
   Y memFunc();
};

template <typename T>
X<T>::Y func() { }   // C2146

// OK
template <typename T>
typename X<T>::Y func() { }

Dieser Fehler wird auch als Ergebnis der Compilerkonformität angezeigt, die für Visual Studio .NET 2003 ausgeführt wurde: Explizite Spezialisierungen finden keine Vorlagenparameter mehr aus der primären Vorlage.

Die Verwendung der T primären Vorlage ist in der expliziten Spezialisierung nicht zulässig. Damit Code in Visual Studio .NET 2003 und Visual Studio .NET gültig ist, ersetzen Sie alle Instanzen des Vorlagenparameters in der Spezialisierung durch den explizit spezialisierten Typ.

Das folgende Beispiel kompiliert in Visual Studio .NET, schlägt jedoch in Visual Studio .NET 2003 fehl:

// C2146_c.cpp
// compile with: /c
template <class T>
struct S;

template <>
struct S<int> {
   T m_t;   // C2146
   int m_t2;   // OK
};