Название: std::unique_ptr Отправлено: AzazelloAV от Июнь 21, 2017, 12:02 Код: class Q_DECL_EXPORT SmiModuleTypes ошибка: C2280: 'std::unique_ptr<SmiModuleTypes::Types,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function with [ _Ty=SmiModuleTypes::Types ] Дальше интересней. Код: class Q_DECL_EXPORT SmiModuleTypes Добавляем строку (см поле mDump) - все ок. Также ок и первый вариант, если убрать Q_DECL_EXPORT Наблюдается под VC 14.0. Под gcc Ок. Мыслей нету. Название: Re: std::unique_ptr Отправлено: Авварон от Июнь 21, 2017, 15:55 Не вижу объявления Types
Название: Re: std::unique_ptr Отправлено: AzazelloAV от Июнь 21, 2017, 18:49 Не вижу объявления Types Объявления Types в реализации. Также добавте сюда всякие = default. Заметте, компилируется и РАБОТАЕТ при добавлении неиспользуемой переменной std::unique_ptr<Types> mDump; ///!!!!!!!!!!!!!!!! Это не единичная ошибка, где "что-то не досмотрел". Танцевал с двумя разными классами так, результат один и тот же. Название: Re: std::unique_ptr Отправлено: Авварон от Июнь 21, 2017, 19:03 Если объявление в реализации, то конструктор и деструктор использующего класса тоже должны быть там же, иначе компилятор пытается их инлайнить и не знает, как создать/удалить класс. Возможно, проблема в этом.
Название: Re: std::unique_ptr Отправлено: AzazelloAV от Июнь 21, 2017, 19:12 Если объявление в реализации, то конструктор и деструктор использующего класса тоже должны быть там же, иначе компилятор пытается их инлайнить и не знает, как создать/удалить класс. Возможно, проблема в этом. Нет, не в этом. Я указал, что всякие дефаулты конструкторов указаны. В моем случае они находятся в реализации. Я привел псевдокод. Ну суть даже не в этом. Допустим я действительно "все сделал не правильно", однако добавление некоторых магических символов делает мой код компилируемым. Если интересно, могу произвести ситуацию в чистом виде. Qt5, VS 14 Название: Re: std::unique_ptr Отправлено: Авварон от Июнь 21, 2017, 20:20 Но ведь компилятор не знает о том, что они дефолтные, когда он включает хедер, у него нет такой информации.
Но вообще, похоже на баг. Осталось понять, чего:) Название: Re: std::unique_ptr Отправлено: Igors от Июнь 22, 2017, 08:33 Было подобное. Одни компиляторы не интересуются типом до момента "инстанциации", а другие его требуют
Название: Re: std::unique_ptr Отправлено: __Heaven__ от Июнь 22, 2017, 09:17 Сделайте деструктор неинлайн
Название: Re: std::unique_ptr Отправлено: __Heaven__ от Июнь 22, 2017, 09:20 Код
Название: Re: std::unique_ptr Отправлено: AzazelloAV от Июнь 22, 2017, 10:26 Код
Повторюсь. Цитировать Также добавте сюда всякие = default. Это псевдокод! Вы же не спрашиваете, зачем класс, в котором нет ни одного метода. Название: Re: std::unique_ptr Отправлено: AzazelloAV от Июнь 22, 2017, 10:27 Но ведь компилятор не знает о том, что они дефолтные, когда он включает хедер, у него нет такой информации. Но вообще, похоже на баг. Осталось понять, чего:) Да не привел я дефолтные просто. В уме добавте я имел в виду. Название: Re: std::unique_ptr Отправлено: Igors от Июнь 22, 2017, 10:53 Ну если уж пошла такая пьянка, то что-нибудь типа
Код: private: Название: Re: std::unique_ptr Отправлено: AzazelloAV от Июнь 22, 2017, 15:38 Ну если уж пошла такая пьянка, то что-нибудь типа Код: private: Спасибо, понял, что не только у меня такое.... Название: Re: std::unique_ptr Отправлено: _Bers от Август 08, 2018, 18:15 где то в коде была попытка задействовать конструктор копии класса-хозяина. это приводит к тому, что вектор должен скопироваться. это приводить к тому, что юник должен скопироваться. но юник копироваться не умеет в принципе. пример: Код: #include <vector> выхлоп: Цитировать error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) |