Sdílet prostřednictvím


Chyba kompilátoru C2146

Chyba syntaxe: Chybí token před identifikátorem identifier

Kompilátor se očekával token a našel identifier místo toho. Možné příčiny:

  1. Chyba pravopisu nebo psaní velkých písmen.

  2. Chybí specifikátor typu v deklaraci identifikátoru.

Příčinou této chyby může být typografická chyba. Chyba C2065 obvykle předchází této chybě.

Příklady

Následující ukázka vygeneruje 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'
}

Tuto chybu lze také vygenerovat v důsledku práce kompilátoru, která byla provedena pro Visual Studio .NET 2003: chybí typename klíčové slovo.

Následující ukázka se v sadě Visual Studio .NET 2002 zkompiluje, ale v sadě Visual Studio .NET 2003 selže:

// 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() { }

Tato chyba se také zobrazí v důsledku práce kompilátoru, která byla provedena pro Visual Studio .NET 2003: Explicitní specializace už nenaleznou parametry šablony z primární šablony.

Použití T z primární šablony není v explicitní specializaci povoleno. Aby byl kód platný v sadě Visual Studio .NET 2003 a Visual Studio .NET, nahraďte všechny instance parametru šablony ve specializaci explicitně specializovaným typem.

Následující ukázka se v sadě Visual Studio .NET zkompiluje, ale v sadě Visual Studio .NET 2003 selže:

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

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