본문 바로가기
프로그래밍/C || CPP

[C++] “Field has incomplete type” error 문제 해결

by _BlankSpace 2018. 7. 11.

C++로 개발하다가 다음과 같은 에러가 발생했는 데...


"Field has incomplete type"


일단, 한국말로는 필드가 불완전한 타입을 가지고 있다는 건데..


보통, 이러한 에러는 전방 선언(forward declaration)을 할 때, 자주 일어나는 에러이다.

물론, 필자도 전방 선언을 하다가 위와 같은 에러가 발생하였다.


이럴 경우, 전방 선언으로 선언한 클래스를 헤더 파일에서 일반 변수로 선언하였는 지 확인을 해볼 필요가 있다.


혹시라도, 전방 선언으로 사용한 클래스를 일반 변수로 선언하였다면, 포인터 또는 레퍼런스 타입으로 변경하면

해당 에러가 발생 하지 않는 것을 확인할 수 있을 것이다.


이것은 컴파일러가 전방 선언의 타입 사이즈를 알 수 없기 때문에 문제가 생긴다고 한다.


그럼, 위와 같은 에러가 발생하는 예를 보자.


전방 선언으로 인한 에러 발생

1
2
3
4
5
6
// 전방 선언
class Apple;
 
class Banana {
    Apple apple; // 에러 발생
};
cs


여기서 Apple이라는 클래스를 전방 선언하였는 데, Banana 클래스에서 Apple을 일반 변수로 선언하였다.

이럴 경우에 에러가 발생하게 된다.


그럼, 위와 같은 경우에 에러를 발생시키지 않게 하려면 어떻게 해야 할까.

먼저, 위에서 설명한대로 포인터 변수로 변경하자.

1
2
3
4
5
6
// 전방 선언
class Apple;
 
class Banana {
    Apple *apple; // Apple의 포인터 
};
cs

위와 같이, 포인터 변수로 변경하면 에러가 발생하지 않는다.


이외에도 에러를 발생하지 않게 하는 방법이 있는 데, 아래 예제를 보자.

1
2
3
4
5
6
// Apple을 
#include "Apple.h"
 
class Banana {
    Apple apple; // Apple의 포인터 변수
};
cs

예제를 보면 알겠지만, 헤더파일을 넣어서 해당 클래스를 선언하는 방법이다.

물론, 전방 선언을 한 이유는 위와 같은 헤더파일의 커플링을 줄이고자 함일 것이라 생각하므로, 위와 같은 방법은 단순 참고만 하면 좋을 것 같다.


참고 : https://stackoverflow.com/questions/12466055/field-has-incomplete-type-error


서로 이웃 추가는 항상 환영입니다. :)

댓글