2016-11-23 226 views
1

我正在構建一個C++庫。我有一個struct,其中包含std::unique_ptr到另一個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

[不能使用std :: unique \ _ptr 而T是前向聲明](http://stackoverflow.com/questions/28386185/cant-use-stdunique-ptrt-with-t-being- a-forward-declaration) – LogicStuff

+0

@LogicStuff不完全;請參閱編輯。 – sdgfsdh

回答

4

當然!

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

std::unique_ptr<MyPrivateStruct> y;MyPrivateStruct沒有成爲一個完整的

也就是說,你可以向前的y聲明前以書面

struct MyPrivateStruct;

聲明。

+3

錯誤。 C++標準並不堅持它。請參閱https://gcc.gnu.org/wiki/FAQ#Why_GCC_does_not_warn_for_mismatch_between_struct_and_class_.28-Wmismatched-tags.29_.3F – SergeyA

+3

哦,哇,我不知道。也許我不應該將自己的知識僅僅基於我的微軟工具鏈。非常感謝你, –

+2

@ FitzwilliamBennet-Darcy VC++不符合[前線數]標準(https://msdn.microsoft.com/en-us/library/x84h5b78(v = vs.140)的.aspx) – jaggedSpire