Как экспортировать класс, содержащий свойство `std :: map` со значениями` std :: unique_ptr` - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть библиотека с классом Cat, который имеет свойство std :: map info:

#ifdef LIB_EXPORT
#define LIB_API __declspec(dllexport)
#else
#define LIB_API __declspec(dllimport)
#endif

// Works!
class Dog {
    std::map<int, std::unique_ptr<int>> info;
};

// Compile errors
class LIB_API Cat {
    std::map<int, std::unique_ptr<int>> info;
};

Предположим: клиенты всегда используют одну и ту же версию std :: unique_ptr, а структура памяти экземпляра Cat совпадает с ожидаемой DLL.

Класс Dog был успешно скомпилирован, однако класс Cat завершился неудачно с 3 ошибками:

C2280 'std :: pair :: pair (const std :: pair &)': попытка сослаться на удаленную функцию

Что я должен сделать, чтобы экспортировать класс Cat?

1 Ответ

0 голосов
/ 04 ноября 2018

Когда Visual Studio необходимо экспортировать класс, он создает все возможные варианты. Он также попытается создать конструктор копирования и оператор назначения копирования, если они явно не удалены.

К сожалению, переменная-член info не может быть скопирована из-за уникального указателя. Поэтому, когда он пытается экспортировать класс, он терпит неудачу.

Добавить:

Cat(const Cat&) = delete;
Cat& operator=(const Cat&) = delete;

К определению вашего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...