Aracılığıyla paylaş


Derleyici Hatası C2146

söz dizimi hatası: 'tanımlayıcı' tanımlayıcısı öncesinde 'belirteç' eksik

Bunun yerine derleyici bekleniyor token ve bulundu identifier . Olası nedenler:

  1. Yazım veya büyük harfe çevirme hatası.

  2. Tanımlayıcının bildiriminde eksik tür tanımlayıcısı.

Bu hataya tipografik bir hata neden olabilir. C2065 hatası genellikle bu hatadan önce olur.

Örnekler

Aşağıdaki örnek C2146 oluşturur.

// 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'
}

Bu hata, Visual Studio .NET 2003 için yapılan derleyici uyumluluğu çalışmasının sonucu olarak da oluşturulabilir: eksik typename anahtar sözcük.

Aşağıdaki örnek Visual Studio .NET 2002'de derlenir ancak Visual Studio .NET 2003'te başarısız olur:

// 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 için yapılan derleyici uyumluluğu çalışmasının sonucu olarak da bu hatayı görürsünüz: açık özelleştirmeler artık birincil şablondan şablon parametrelerini bulamaz.

Açık özelleştirmede birincil şablondan kullanımına T izin verilmez. Kodun Visual Studio .NET 2003 ve Visual Studio .NET'te geçerli olması için, uzmanlık alanındaki şablon parametresinin tüm örneklerini açıkça özelleştirilmiş türle değiştirin.

Aşağıdaki örnek Visual Studio .NET'te derlenir ancak Visual Studio .NET 2003'te başarısız olur:

// C2146_c.cpp
// compile with: /c
template <class T>
struct S;

template <>
struct S<int> {
   T m_t;   // C2146
   int m_t2;   // OK
};