Błąd kompilatora C2146
błąd składni: brak "tokenu" przed identyfikatorem "identifier"
Zamiast tego kompilator oczekiwał token
i odnalazł identifier
. Możliwe przyczyny:
Błąd pisowni lub wielkiej litery.
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
};