> 백엔드 개발 > C++ > 불완전한 유형과 함께 `std::unique_ptr`을 사용하면 컴파일 오류가 발생하는 이유는 무엇입니까?

불완전한 유형과 함께 `std::unique_ptr`을 사용하면 컴파일 오류가 발생하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-04 09:58:16
원래의
208명이 탐색했습니다.

Why Does Using `std::unique_ptr` with an Incomplete Type Cause a Compile Error?

불완전한 유형 컴파일 오류가 있는 std::unique_ptr

std::unique_ptr 클래스는 객체의 수명을 관리하도록 설계되었습니다. 완전 유형과 불완전 유형 모두에 사용할 수 있습니다. 그러나 아래 코드 조각에서 볼 수 있듯이 불완전한 유형으로 std::unique_ptr을 선언하려고 하면

class window {
  window(const rectangle& rect);

private:
  class window_impl; // defined elsewhere
  std::unique_ptr<window_impl> impl_; // won't compile
};
로그인 후 복사

불완전한 유형의 사용과 관련된 컴파일 오류가 발생할 수 있습니다. 이 오류는 std::unique_ptr과 함께 pimpl을 사용할 때 소멸자를 선언해야 한다는 사실에서 비롯됩니다.

class foo {
  class impl;
  std::unique_ptr<impl> impl_;

public:
  foo(); // You may need a def. constructor to be defined elsewhere

  ~foo(); // Implement (with {}, or with = default;) where impl is complete
};
로그인 후 복사

소멸자가 명시적으로 선언되지 않은 경우 컴파일러는 완전한 소멸자가 필요한 기본 소멸자를 생성합니다. foo::impl 클래스 선언. 이로 인해 불완전한 유형으로 작업할 때 컴파일 오류가 발생할 수 있습니다.

이 문제를 해결하려면 위의 코드 조각에서 볼 수 있듯이 본문이 비어 있거나 기본값으로 설정하여 클래스에 대한 소멸자를 구현하세요. 이렇게 하면 컴파일러가 std::unique_ptr에 의해 관리되는 객체의 소멸을 적절하게 처리할 수 있습니다.

또한, 불완전한 유형의 std::unique_ptr을 사용하는 것은 네임스페이스 범위에서 지원되지 않습니다. 대신 아래 코드 조각에 설명된 대로 소멸자를 제공하는 사용자 정의 구조체 내에 std::unique_ptr을 래핑하여 해결 방법을 사용할 수 있습니다.

class impl;
struct ptr_impl : std::unique_ptr<impl> {
  ~ptr_impl(); // Implement (empty body) elsewhere
} impl_;
로그인 후 복사

위 내용은 불완전한 유형과 함께 `std::unique_ptr`을 사용하면 컴파일 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿