Ошибка компилятора при экспорте класса

#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. На этом спасибо, компилятору требовался явный конструктор копирования и присваивания копирования.