2016-11-23 2 views
1

나는 C++ 라이브러리를 구축 중이다. 내가 std::unique_ptr에서 다른 struct까지 사용자가 숨기려고하는 struct이 있습니다. 예를 들어헤더 파일에서 스마트 포인터의 형식 인수를 생략 할 수 있습니까?

:

struct MyStruct { 
    int x; 
    private: 
    std::unique_ptr<MyPrivateStruct> y; 
}; 

지금, 나는 사용자들이 레이아웃을 알 수 있도록 포함 할 수있는 헤더 파일에 MyStruct을 지정해야합니다. 그러나 이것은 내가 원하지 않는 MyPrivateStruct의 헤더를 노출해야합니다. unique_ptr의 크기는 유형에 관계없이 동일하므로 이와 같은 작업을 수행 할 수 있습니까?

struct MyStruct { 
    int x; 
    private: 
    std::unique_ptr<auto> y; 
}; 

y의 유형은 다음 내 cpp 파일에 의해 결정된다.


매우없는이 질문에 대한 대답은 앞으로 선언을 사용하는 것입니다 때문에 Can't use std::unique_ptr<T> with T being a forward declaration과 같은 질문입니다. 이 질문은 전달 선언을 사용할 때의 문제입니다.

+0

그냥 앞으로 구조체를 선언 하시겠습니까? 아니면 그 일을 피하려고하는 것입니까? – Borgleader

+3

[T가 순방향 선언 인 std :: unique \ _ptr 을 사용할 수 없음] (http://stackoverflow.com/questions/28386185/cant-use-stdunique-ptrt-with-t-being- a-forward-declaration) – LogicStuff

+0

@LogicStuff 아닙니다. 편집을 참조하십시오. – sdgfsdh

답변

4

확실! std::unique_ptr<MyPrivateStruct> y;에서

struct MyPrivateStruct; 

struct MyStruct { 
    int x; 
    private: 
    std::unique_ptr<MyPrivateStruct> y; 
}; 
+2

Visual Studio에서 저에게는 MyStruct에서 빈 소멸자를 만들어서 불완전한 유형 때문에 컴파일하기 위해 기본값을 사용하는 대신 cpp 파일에서 정의해야합니다. 이 답변처럼 : http://stackoverflow.com/a/9954553/487892 – drescherjm

+1

@drescherjm 예. '~ unique_ptr'은 템플리트 타입이 무엇이든간에 소멸자를 호출합니다. 디폴트 소멸자가 생성되도록 허용하면'~ MyPrivateStruct'의 정의가 보이지 않습니다. 왜냐하면 그 시점에서 선언 된 것이기 때문입니다. – lcs

+0

그래, 고통의 일부. 대신 shared_ptr을 사용하면 문제가 없지만 그 이유 때문에 사용하지 않는 것이 좋습니다. –

2

MyPrivateStruct완전한 형태 일 필요는 없습니다. 이다

, 당신은 앞으로 이전 y의 선언에

struct MyPrivateStruct;

를 작성하여이를 선언 할 수 있습니다.

+3

잘못되었습니다. C++ 표준은 그것을 고집하지 않습니다. https://gcc.gnu.org/wiki/FAQ#Why_GCC_does_not_warn_for_mismatch_between_struct_and_class_.28- 불일치 - 태그 2,9_.3F – SergeyA

+3

와우, 나는 그것을 몰랐다. 아마 필자는 필자의 Microsoft 툴체드에 대한 지식만으로는 안됩니다. 고맙습니다. –

+2

@ FitzwilliamBennet-Darcy VC++는 [앞 번호] (https://msdn.microsoft.com/en-us/library/x84h5b78(v=vs.140))의 표준을 준수하지 않습니다. .aspx) – jaggedSpire

관련 문제