Когда вы объявляете класс с declspec(dllexport)
, компилятор должен сгенерировать все функции-члены класса, включая конструкторы по умолчанию, функции копирования и т. Д., Так как он не знает, какие из них могут понадобиться при импортемодуль.Это описано в Использование dllimport и dllexport в классах C ++ .
Поскольку unique_ptr
не может быть скопировано, его конструктор копирования и операторы назначения копирования удаляются, и когда векторный объект пытаетсяиспользуйте их, чтобы получить ошибку C2280
.
Если вы не включите declspec(dllexport)
, компилятор будет генерировать только те функции, которые фактически используются, и проблемных копий не будет.
Одним из способов решения этой проблемы является экспорт отдельных функций-членов класса, что может означать указание некоторых из них по умолчанию.virtual
Функции не нужно экспортировать, так как они обрабатываются виртуальной таблицей.
Другой обходной путь - явное удаление конструктора копирования и оператора назначения копирования.Так как это предотвратит создание конструктора по умолчанию и переместит функции конструктора / присваивания, вам может потребоваться использовать их по умолчанию.
class UNIQUEPTRISSUE_API ClassB {
public:
ClassB(const ClassB &) = delete;
ClassB &operator=(const ClassB &) = delete;
// You may need to explicitly default these if they are used
ClassB() = default;
ClassB &operator=(ClassB &&) = default;
ClassB(ClassB &&) = default;
private:
std::vector<std::unique_ptr<ClassA>> x;
};