본문 바로가기
코드

forward declaration of unique_ptr<T>

by ehei 2021. 1. 21.
// A.h
class A
{
    A();
    std::unique_ptr<class B> _b;
}

// A.cpp
A::A() : _b{ std::make_unique<B>() }
{}

포인터나 참조를 헤더에 정의한 경우 전방 선언은 필수로 요구된다. 컴파일보다 링킹이 빠르기 때문이다. 허나 이것을 컴파일하면 C2027 오류를 받게 된다. 오류를 살펴보면 unique_ptr의 소멸자에서 T를 실체화하려고 시도하다가 났다는 것을 알 수 있다.

 

소멸자를 선언하면 오류가 나지 않는다. 이때 인라인이어서는 안된다. 그러나 왜 이럴까? 이는 사용자 정의 소멸자가 없으면 컴파일러가 암시적으로 삽입하기 때문이다. 이걸 인라인으로 처리한다. 이는 헤더에 삽입된다는 의미가 된다. 헤더에는 전방 선언 뿐이므로 해당 오류가 발생한다.

 

따라서 소멸자 본체를 소스에 기술해주면 해결된다. 아쉽게도 rule of five를 지키기 위해 소멸자를 생략하려는 노력이 배신을 받는다고 생각할 수도 있다. 다행히 unique_ptr은 복사할 수 없기 때문에 별도의 복사 생성자, 복사 배정 연산자를 정의하려는 시도는 무익하다. unique_ptr은 이동 연산자가 이미 지정되어 있어 컴파일러가 자동으로 삽입해주는 이동 연산자, 이동 배정 연산자 만으로도 충분히 동작한다.

 

참고

https://stackoverflow.com/questions/27336779/unique-ptr-and-forward-declaration/27624369#27624369

https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.4.0/com.ibm.zos.v2r4.cbclx01/cplr380.htm

'코드' 카테고리의 다른 글

std::remove_if  (0) 2021.01.21
instance in underlying array  (0) 2021.01.21
최신 STL 배우는 방법  (0) 2020.12.15
C++ 명언  (0) 2020.12.15
테트리스  (0) 2020.04.13