#c #visual-c #c 11
#c #visual-c #c 11
Вопрос:
Я использую Visual Studio 2013, и у меня возникла странная проблема. Когда я экспортирую класс, он выдает ошибку «попытка сослаться на удаленную функцию». Однако, когда класс не экспортируется, он ведет себя корректно.
Позвольте мне привести пример…
class Foo
{
};
// note the export
class __declspec(dllexport) Bar
{
// the following line throws the error
std::unordered_map<std::string, std::unique_ptr<Foo>> map;
};
Теперь, если я удалю экспорт, чтобы все выглядело следующим образом, все работает так, как ожидалось.
class Foo
{
};
// note I removed the export
class Bar
{
// the following line now compiles without any issues
std::unordered_map<std::string, std::unique_ptr<Foo>> map;
};
Итак, это ошибка компилятора или что-то еще, чего мне явно не хватает? Просто для справки, приведенный выше код отлично работает с GCC или Clang.
Error 2 error C2280: 'std::unique_ptr<Foo,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> amp;)' : attempting to reference a deleted function c:program files (x86)microsoft visual studio 12.0vcincludexmemory0 592
Комментарии:
1. Это не похоже на полное сообщение об ошибке. Пожалуйста, отредактируйте свой вопрос, включив в него полный и неотредактированный журнал ошибок.
2. Теперь я вставил полную ошибку.
Ответ №1:
При экспорте класса из библиотеки dll компилятор явно генерирует все специальные методы-члены (конструктор копирования и т.д., Которые в противном случае были бы оставлены необъявленными). Как вы видите, сгенерированный конструктор копирования затем генерирует недопустимую копию для уникального указателя; отсюда и ошибка.
Я не думаю, что это просто ошибка, я думаю, что это, скорее всего, часть неподдерживаемого сценария.
Вы могли бы попробовать явно удалить в Bar
конструкторе копирования класса и проверить, принимает ли это компилятор.
Комментарии:
1. На этом спасибо, компилятору требовался явный конструктор копирования и присваивания копирования.