출처: http://blog.naver.com/PostView.nhn?blogId=sainthkh&logNo=140063257447

클래스 선언과 관련된 몇가지 알고나면 어이없는 오류들[1] C2236 ▶ Program Tips/ ★IT/Programming

2009/02/17 18:52

복사 http://blog.naver.com/sainthkh/140063257447

error C2236: unexpected 'class' 'B'. Did you forget a ';'?
error C2143: syntax error : missing ';' before ':'
error C2059: syntax error : ':'

이 오류가 뜰 때에는 대체로 이 세가지 정도가 같이 뜹니다.

이 문제는 class 선언 끝에 ;을 붙이지 않았기 때문에 생깁니다.

그런데 이게 조금 찾기 어려운 경우가 있습니다.


--------------------------------------------------------------------------------------------
<A.h>
#ifndef CLASS_A
#define CLASS_A

#include <stdio.h>

class A
{
private:
    int x;
public:
    void f() { printf("A::f()"); }
}

#endif // CLASS_A

<B.h>
#ifndef CLASS_B
#define CLASS_B

#include "A.h"

class B : public A
{
private:
    int a;
public:
    void g() { printf("B::g()"); }
};

#endif // CLASS_B

<main.cpp>
#include "A.h"
#include "B.h"

void main()
{
    A a;
    B b;

    a.f();
    b.g();
}
-------------------------------------------------------------------------------------------

단순한 클래스 A를 선언하고 또 단순한 클래스 B를 A에서 상속받습니다. 그리고 main()에서 A와 B를 사용해 봅니다.

그런데 이 프로그램의 문제는 A 클래스 끝에 ;이 없다는 것인데,

오류는 B클래스에 뜹니다. (실제로 Visual Studio에서 쳐 보면 B 클래스에 위에서 소개한 오류가 뜹니다.)

이렇게  #include를 통해 파일을 건너서 문제가 생기는 경우는 참 잡기 어렵습니다.

C2236이 생겼을 경우 어딘가 ;이 붙지 않았구나 생각하시고 잘 찾아보시기 바랍니다.

struct와 enum이 끝날 때에도 붙여야 하니 절대로 잊지 마시기 바랍니다.

(자바를 하다가 C++을 하게 되면 자주 잊게 되는 부분 중에 하나죠....)
AND