Erreur du compilateur C2146
erreur de syntaxe : jeton manquant avant l’identificateur 'identificateur'
Le compilateur attendu token
et trouvé identifier
à la place. Causes possibles :
Erreur d’orthographe ou de mise en majuscule.
Spécificateur de type manquant dans la déclaration de l’identificateur.
Cette erreur peut être due à une erreur typographique. L’erreur C2065 précède généralement cette erreur.
Exemples
L’exemple suivant génère l’erreur C2146.
// 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'
}
Cette erreur peut également être générée suite au travail de conformité du compilateur effectué pour Visual Studio .NET 2003 : mot clé manquants typename
.
L’exemple suivant compile dans Visual Studio .NET 2002, mais échoue dans Visual Studio .NET 2003 :
// 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() { }
Vous verrez également cette erreur en raison du travail de conformité du compilateur effectué pour Visual Studio .NET 2003 : les spécialisations explicites ne trouvent plus de paramètres de modèle à partir du modèle principal.
L’utilisation du T
modèle principal n’est pas autorisée dans la spécialisation explicite. Pour que le code soit valide dans Visual Studio .NET 2003 et Visual Studio .NET, remplacez toutes les instances du paramètre de modèle dans la spécialisation par le type explicitement spécialisé.
L’exemple suivant compile dans Visual Studio .NET, mais échoue dans Visual Studio .NET 2003 :
// C2146_c.cpp
// compile with: /c
template <class T>
struct S;
template <>
struct S<int> {
T m_t; // C2146
int m_t2; // OK
};