스마트 포인터의 표준 컨테이너에서 사용할 때 전체 클래스 정의가 표시되는 것을 피할 수 있습니까? 예를 들어 나는 다음은 컴파일 할 수 없습니다unique_ptr의 표준 컨테이너에서 사용할 클래스를 선언하는 방법
#include <memory>
#include <map>
class Foo;
class Bar {
public:
Bar();
std::map<int, std::unique_ptr<Foo>> myMap;
};
연타 컴파일러는 Bar
를 컴파일 할 때 사용할 수 Foo
의 전체 정의를 가지고 주장 것으로 보인다. Foo.h를 포함하지 않아도되는 기술이 있습니까?
EDIT1 :
error: invalid application of 'sizeof' to an incomplete type 'Foo': static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type");
Edit2가 : 아니 그것은 is std::unique_ptr required to know the full definition의 중복이 아니다. unique_ptr을 사용하는 것만으로는 완전한 정의가 반드시 필요한 것은 아니지만 표준 컨테이너 안에서 사용하면 추가적인 주름이 생깁니다.
Edit3 : 가상 소멸자가있는 기본 클래스를 도입하여 원하는대로 (거의) 달성 할 수 있습니다. 그런 다음 기본 클래스에 대한 스마트 포인터 컨테이너가있는 클래스는 문제가 없으면 컴파일합니다. 기본 클래스에 기본 클래스가 있어야하며 기본 클래스가 완전히 표시되어야합니다. 컨테이너를 컴파일 할 때이 방식으로 모든 파생 클래스의 복잡성을 숨길 수 있습니다.
'unique_ptr'은 (다른 유형자와 함께) 오타 일 수 있습니다. –
[실제 코드를 표시하십시오.] (http://coliru.stacked-crooked.com/a/4b71c4045c07b58e). –
무엇이 오류입니까? 코드의 오타를 수정할 수 있습니까? –