Является ли std :: unique_ptr <T> необходимым для определения полного определения T? [c++]


Answers

Компилятор нуждается в определении Thing для создания деструктора по умолчанию для MyClass. Если вы явно объявляете деструктор и перемещаете его (пустую) реализацию в файл CPP, код должен компилироваться.

Question

У меня есть код в заголовке, который выглядит так:

#include <memory>

class Thing;

class MyClass
{
    std::unique_ptr< Thing > my_thing;
};

Если я включу этот заголовок в cpp, который не включает определение типа Thing , то это не компилируется под VS2010-SP1:

1> C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ include \ memory (2067): ошибка C2027: использование неопределенного типа 'Thing'

Замените std::unique_ptr на std::shared_ptr и он скомпилируется.

Итак, я предполагаю, что это текущая реализация VS2010 std::unique_ptr unique_ptr, которая требует полного определения и полностью зависит от реализации.

Или это? Есть ли что-то в его стандартных требованиях, что делает невозможным реализацию проекта std::unique_ptr только для прямого объявления? Это странно, поскольку он должен держать указатель на Thing , не так ли?




Полное определение Вещей требуется в момент создания шаблона. Это точная причина, по которой компиляция иконостаса pimpl.

Если бы это было невозможно, люди не задавали бы таких вопросов.