Dela via


Kompilatorfel C2146

syntaxfel: "token" saknas innan identifieraren "identifierare"

Anmärkningar

Kompilatorn förväntade sig token och fann identifier i stället. Möjliga orsaker:

  1. Stavnings- eller versalfel.

  2. Typspecificerare saknas i identifierarens deklaration.

Det här felet kan orsakas av ett typografiskt fel. Felet C2065 föregår vanligtvis det här felet.

Exempel

I följande exempel genereras 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'
}

Det här felet kan också genereras som ett resultat av kompilatorns efterlevnadsarbete som utfördes för Visual Studio .NET 2003: nyckelordet saknas typename .

Följande exempel kompileras i Visual Studio .NET 2002 men misslyckas i 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() { }

Du kommer också att se det här felet som ett resultat av kompilatorkonformansarbete som utfördes för Visual Studio .NET 2003: explicita specialiseringar hittar inte längre mallparametrar från den primära mallen.

Användning av T från den primära mallen tillåts inte i den explicita specialiseringen. För att koden ska vara giltig i Visual Studio .NET 2003 och Visual Studio .NET ersätter du alla instanser av mallparametern i specialiseringen med den uttryckligen specialiserade typen.

Följande exempel kompileras i Visual Studio .NET men misslyckas i 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
};