Я получаю сообщение об ошибке со следующим:
class Test
{
std::map<std::string,Test> test;
};
Ошибка «Поле имеет неполный тип« Тест »». Я прочитал несколько веток с предположением, что это может быть ошибкой в версии libcxx, которая поставляется с xcode, но меня совсем не удивит, если мне просто придется изменить его на:
class Test
{
std::map<std::string,std::shared_ptr<Test>> test;
};
Я просто хотел дважды проверить, что это определенно правильная ошибка, а не ошибка.
Ура!
Стандарт требует, чтобы все типы, используемые в шаблонных компонентах стандартной библиотеки, были полными, если не указано иное. Таким образом, ошибка в libc ++ верна. Использование неполного типа — неопределенное поведение (§17.6.4.8 [res.on.functions] / 2), поэтому принятие libstdc ++ также не является неправильным.
Вы можете использовать объект указателя для создания полного типа, как вы это сделали. Но вы также можете использовать библиотеку сторонних коллекций, которая допускает неполные типы, например, boost::container::map
является разработан, чтобы допускать неполные типы.
§17.6.4.8 Другие функции / 2:
В частности, эффекты не определены в следующих случаях:
…
если неполный тип (3.9) используется в качестве аргумента шаблона при создании экземпляра компонента шаблона, если это специально не разрешено для этого компонента.
(Единственные компоненты, которые явно разрешают неполные типы declval
, unique_ptr
, default_delete
, shared_ptr
, weak_ptr
а также enable_shared_from_this
.)
Других решений пока нет …