Błąd kompilatora C2146

błąd składni: brak "tokenu" przed identyfikatorem "identifier"

Zamiast tego kompilator oczekiwał token i odnalazł identifier . Możliwe przyczyny:

  1. Błąd pisowni lub wielkiej litery.

  2. Brak specyfikatora typu w deklaracji identyfikatora.

Ten błąd może być spowodowany błędem typograficznego. Błąd C2065 zwykle poprzedza ten błąd.

Przykłady

Poniższy przykład generuje kod 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'
}

Ten błąd można również wygenerować w wyniku pracy kompilatora, która została wykonana dla programu Visual Studio .NET 2003: brakujące typename słowo kluczowe.

Poniższy przykład kompiluje się w programie Visual Studio .NET 2002, ale zakończy się niepowodzeniem w programie 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() { }

Ten błąd zostanie również wyświetlony w wyniku pracy kompilatora, która została wykonana dla programu Visual Studio .NET 2003: jawne specjalizacje nie znajdą już parametrów szablonu z szablonu podstawowego.

Korzystanie T z szablonu podstawowego nie jest dozwolone w jawnej specjalizacji. Aby kod był prawidłowy w programach Visual Studio .NET 2003 i Visual Studio .NET, zastąp wszystkie wystąpienia parametru szablonu w specjalizacji jawnie wyspecjalizowanym typem.

Poniższy przykład kompiluje się na platformie .NET programu Visual Studio, ale zakończy się niepowodzeniem w programie 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
};