Compilerfehler C2146
Aktualisiert: November 2007
Fehlermeldung
Syntaxfehler: Fehlendes 'Token' vor Bezeichner 'Bezeichner'
syntax error : missing 'token' before identifier 'identifier'
Der Compiler hat ein token erwartet, jedoch einen identifier gefunden. Mögliche Ursachen:
Schreibfehler oder falsche Groß-/Kleinschreibung.
Fehlender Typspezifizierer in der Deklaration des Bezeichners.
Dieser Fehler wird möglicherweise durch einen typografischen Fehler verursacht. Der Fehler C2065 geht diesem Fehler normalerweise voraus.
Beispiel
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 aufgrund einer Verbesserung der Compilerkonformität in Visual Studio .NET 2003 ausgegeben werden: fehlendes typename-Schlüsselwort. Weitere Informationen finden Sie unter Übersicht über die wichtigsten Änderungen bei der Kompilierzeit.
Der folgende Beispielcode wird in Visual Studio .NET 2002 kompiliert, verursacht in Visual Studio .NET 2003 jedoch einen Fehler:
// 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 kann auch aufgrund einer Verbesserung der Compilerkonformität in Visual Studio .NET 2003 ausgegeben werden: explizite Spezialisierungen finden nicht länger Vorlagenparameter aus der primären Vorlage.
Die Verwendung von T aus der primären Vorlage ist in der expliziten Spezialisierung nicht zulässig. In Code, der in der Visual Studio .NET 2003-Version und der Visual Studio .NET-Version von Visual C++ gültig sein soll, ersetzen Sie alle Instanzen des Vorlagenparameters in der Spezialisierung durch den explizit spezialisierten Typ.
Weitere Informationen finden Sie unter Übersicht über die wichtigsten Änderungen bei der Kompilierzeit.
Der folgende Beispielcode wird in Visual Studio .NET kompiliert, verursacht in Visual Studio .NET 2003 jedoch einen Fehler:
// C2146_c.cpp
// compile with: /c
template <class T>
struct S;
template <>
struct S<int> {
T m_t; // C2146
int m_t2; // OK
};