Delen via


Compilerfout C2146

syntaxisfout: ontbrekend 'token' vóór id 'id'

Opmerkingen

De compiler verwachtte token maar vond identifier. Mogelijke oorzaken:

  1. Spel- of hoofdlettergebruiksfout.

  2. Typeaanduiding ontbreekt in de declaratie van de id.

Deze fout kan worden veroorzaakt door een typografische fout. Fout C2065 gaat meestal vooraf aan deze fout.

Voorbeelden

In het volgende voorbeeld wordt C2146 gegenereerd.

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

Deze fout kan ook worden gegenereerd als gevolg van het werk aan compilerconformiteit dat is uitgevoerd voor Visual Studio .NET 2003: ontbrekend trefwoord typename.

Het volgende voorbeeld compileert in Visual Studio .NET 2002, maar mislukt in 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() { }

nl-NL: U ziet deze fout ook als gevolg van het werk aan compilerconformiteit dat is uitgevoerd voor Visual Studio .NET 2003: expliciete specialisaties kunnen geen sjabloonparameters meer vinden in de primaire sjabloon.

Het gebruik van T van de primaire sjabloon is niet toegestaan in de expliciete specialisatie. Voor een geldige code in Visual Studio .NET 2003 en Visual Studio .NET vervangt u alle exemplaren van de sjabloonparameter in de specialisatie door het expliciet gespecialiseerde type.

Het volgende voorbeeld compileert in Visual Studio .NET, maar mislukt in 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
};