Megosztás a következőn keresztül:


C2146-os fordítási hiba

szintaxishiba: hiányzik a "token" az 'identifier' azonosító előtt

Megjegyzések

A fordító token várt, de ehelyett identifier talált. Lehetséges okok:

  1. Helyesírási vagy nagybetűs hiba.

  2. Hiányzik a típusjelölő az azonosító deklarációjában.

Ezt a hibát tipográfiai hiba okozhatja. A C2065 hiba általában megelőzi ezt a hibát.

Példák

Az alábbi példa C2146-ot hoz létre.

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

Ez a hiba a Visual Studio .NET 2003: hiányzó typename kulcsszóhoz végzett fordítómegformelési munka eredményeként is létrejön.

Az alábbi példa a Visual Studio .NET 2002-ben áll össze, de a Visual Studio .NET 2003-ban sikertelen lesz:

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

Ez a hiba a Visual Studio .NET 2003-hoz készült fordítómegformálási munka eredményeként is megjelenik: az explicit specializációk már nem találnak sablonparamétereket az elsődleges sablonból.

T Az elsődleges sablon használata nem engedélyezett az explicit specializációban. Ahhoz, hogy a kód érvényes legyen a Visual Studio .NET 2003-ban és a Visual Studio .NET-ben, cserélje le a sablonparaméter minden példányát a specializációban kifejezetten specializált típusra.

Az alábbi példa a Visual Studio .NET-ben fordításra kerül, de a Visual Studio .NET 2003-ban sikertelen lesz:

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

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