編譯器錯誤 C2146

語法錯誤:識別碼 'identifier' 之前遺漏 'token'

編譯器預期 token 會改為找到 identifier 。 可能的原因:

  1. 拼字或大寫錯誤。

  2. 識別碼宣告中遺漏類型規範。

此錯誤可能是因為印刷錯誤所造成。 錯誤 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
};