編譯器錯誤 C2146
語法錯誤:識別碼 'identifier' 之前遺漏 'token'
編譯器預期 token
會改為找到 identifier
。 可能的原因:
拼字或大寫錯誤。
識別碼宣告中遺漏類型規範。
此錯誤可能是因為印刷錯誤所造成。 錯誤 C2065 通常位於此錯誤之前。
範例
下列範例會產生 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'
}
這個錯誤也可能因為針對 Visual Studio .NET 2003:missing typename
關鍵字所做的編譯器一致性工作而產生。
下列範例會在 Visual Studio .NET 2002 中編譯,但在 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() { }
您也會因為針對 Visual Studio .NET 2003 完成的編譯器一致性工作而看到此錯誤:明確特製化不再從主要範本找到範本參數。
明確特製化不允許從主要範本使用 T
。 若要讓程式碼在 Visual Studio .NET 2003 和 Visual Studio .NET 中有效,請將特製化中的所有範本參數實例取代為明確特製化類型。
下列範例會在 Visual Studio .NET 中編譯,但在 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
};