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

MyPrivateStruct в std::unique_ptr<MyPrivateStruct> y; не должен быть полный тип.

То есть, вы можете объявить вперед, написав

struct MyPrivateStruct;

до объявления y.

+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

Ого, я этого не знал. Возможно, я не должен основывать свои знания исключительно на моей технологической цепочке Microsoft. Большое спасибо, –

+2

@ FitzwilliamBennet-Darcy VC++ не соответствует стандарту на [количество фронтов] (https://msdn.microsoft.com/en-us/library/x84h5b78 (v = vs.140) .aspx) – jaggedSpire

Смежные вопросы