Если вы можете использовать неполный тип MoveTree
в качестве параметра шаблона в любом шаблоне, то используйте одно из решений в других ответах (например, Cat Plus Plus), или просто используйте свое оригинальное решениеДобавьте несколько тяжелых комментариев и сделайте покаяние позже.
Если вы не можете использовать его как любой параметр шаблона, пока он еще не завершен, вы можете использовать идиому pimpl чтобы обойти это.
Ко времени определения класса реализации класс MoveTree
будет завершен:
struct Move
{
int src;
int dst;
};
struct MoveTreeImpl;
struct MoveTree
{
Move move;
// Todo: Implement RAII here for the impl
// Todo: Provide impl accessor functions here
private:
MoveTreeImpl* impl;
};
struct MoveTreeImpl
{
std::vector<MoveTree> variation;
};
В этом решении есть волосатые части:
Поскольку вы пытаетесь избежать прямого создания экземпляра любого шаблона с неполными типами, вам придется реализовать RAII вручную.Вы не получите помощь от std::scoped_ptr<MoveTreeImpl>
, так как MoveTreeImpl
также неполный.
Какая подпись у ваших функций доступа?Можете ли вы вернуть std::vector<MoveTree>&
от средства доступа?Я не уверен в этом - мы стараемся избегать шаблонов, которые используют MoveTree
напрямую.Это может отличаться, потому что это не элемент данных, но я не уверен:)
Редактировать:
Чтение немного больше и получение ответов отдругим пользователям, кажется, большая часть этой ерунды не нужна.Только стандартные контейнеры имеют ограничение.Вы могли бы реализовать pimpl
с std:scoped_ptr<MoveTreeImpl>
, и я думаю, что верните std::vector<MoveTree>&
из функции доступа, оба без проблем.