Condividi tramite


Errore del compilatore C2146

errore di sintassi: mancante 'token' prima dell'identificatore 'identifier'

Previsto e trovato identifier invece il compilatoretoken. Possibili cause:

  1. Errore di ortografia o maiuscola.

  2. Identificatore di tipo mancante nella dichiarazione dell'identificatore.

Questo errore può essere causato da un errore tipografico. L'errore C2065 precede in genere questo errore.

Esempi

L'esempio seguente genera l'errore 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'
}

Questo errore può essere generato anche in seguito a operazioni di conformità del compilatore eseguite per Visual Studio .NET 2003: parola chiave mancante typename .

L'esempio seguente viene compilato in Visual Studio .NET 2002, ma avrà esito negativo 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() { }

Questo errore verrà visualizzato anche in seguito al lavoro di conformità del compilatore eseguito per Visual Studio .NET 2003: le specializzazioni esplicite non trovano più i parametri del modello dal modello primario.

L'uso di T dal modello primario non è consentito nella specializzazione esplicita. Affinché il codice sia valido in Visual Studio .NET 2003 e Visual Studio .NET, sostituire tutte le istanze del parametro modello nella specializzazione con il tipo specializzato in modo esplicito.

L'esempio seguente viene compilato in Visual Studio .NET ma avrà esito negativo 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
};