Насколько мне известно, начиная с C++17, некоторые структуры данных STL могут "существовать" с неполным типом в качестве параметра шаблона, описывающего хранимый тип. Например, я могу использовать std::unique_ptr<Incomplete>
(хотя я не уверен, что это структура данных) или std::vector<Incomplete>
в качестве членов класса, если все свойства класса (для которых требуется определение Incomplete
) реализованы в отдельном файле .cpp:
class Incomplete;
using Complete = int;
class Foo {
private:
std::unique_ptr<Incomplete> u_p;
std::vector<Incomplete> v;
std::deque<Incomplete> d;
std::list<Incomplete> l;
std::set<Incomplete> s;
std::unordered_map<Complete, Complete> u_m_cc;
std::unordered_map<Complete, Incomplete> u_m_ci;
std::unordered_map<Incomplete, Complete> u_m_ic;
std::unordered_map<Incomplete, Incomplete> u_m_ii;
public:
// implemented in a separate .cpp which has Incomplete defined:
Foo();
Foo(Foo&&);
Foo& operator=(Foo&&);
Foo(Foo const&);
Foo& operator=(Foo const&);
~Foo();
};
Итак, какие из элементов данных, перечисленных выше, допустимы для такого использования? Как насчет других структур данных, интеллектуальных указателей и т. д.?
std::vector
иstd::unique_ptr
в порядке,std::unordered_map
отказался работать на моем MSVC: std::pair использует неполную структуру. Даже если он что-то компилирует, не факт, что он будет в стандарте, вот в чем проблема, которую я вижу в таком тестировании. - person passing_through   schedule 01.02.2020std::pair
— это POD, поэтому любые контейнеры сstd::pair
в качестве члена не будут работать с неполными типами. Одним интересным исключением из этого являетсяunion
, где выделение находится в стеке, но только первый член списка объединения должен быть полным типом. Остальные могут быть неполными. Насколько я помню,std::optional
использует это свойство. - person cplusplusrat   schedule 01.02.2020std::pair
, а не его членов. Как и любой другой тип, самstd::pair
может находиться в стеке или в куче. Я упомянул об этом, потому что первые несколько предложений в комментарии, на который я ответил, звучали для меня так, как будтоstd::pair
тривиальность каким-то образом мешалаstd::unordered_map
принимать неполные типы, что, насколько я могу судить, не так. - person walnut   schedule 02.02.2020