2016-11-23 214 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