다음을 통해 공유


컴파일러 오류 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: 누락 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
};