Ссылаясь на MSV C ошибка C2280 :
Компилятор обнаружил попытку ссылки на удаленную функцию. Эта ошибка может быть вызвана вызовом функции-члена, которая была явно помечена как = удалено в исходном коде. Эта ошибка также может быть вызвана вызовом неявной специальной функции-члена структуры или класса, которая автоматически объявляется и помечается как удаленная компилятором. Для получения дополнительной информации о том, когда компилятор автоматически создает стандартные или удаленные специальные функции-члены, см. Специальные функции-члены.
В вашем случае, поскольку в вашем классе ABC
имеется конструктор перемещения, компилятор неявно объявляет копию оператор присваивания как удаленный Вот почему вы получаете эту ошибку.
Поскольку вы хотите, чтобы ABC
был классом только для перемещения, вы можете объявить оператор присваивания перемещения и использовать семантику перемещения в XYZ::func()
:
obj = std::move(maskfilename("abcd.txt"));
Вот возможная реализация вашего класса ABC
:
class ABC
{
public:
ABC() = delete;
ABC(const std::string& filename) : mFilename(filename) {}
virtual ~ABC() = default;
ABC(const ABC&) = delete;
ABC(ABC&&) = default;
ABC& operator= (ABC&&) = default;
std::string GetFilename() const { return mFilename; }
private:
std::string mFilename;
};
В вашем классе
XYZ
вы не можете иметь переменную-член
obj
типа
ABC
, так как по умолчанию Конструктор удален. Если вам нужно использовать такой объект в других методах
XYZ
, вы можете использовать уникальный указатель на
ABC
. Поэтому я бы изменил это так:
XYZ.h: #include "AB C .h" #include
class XYZ
{
public:
void func();
private:
std::unique_ptr<ABC> obj;
std::unique_ptr<ABC> maskfilename(std::string filename);
};
XYZ. cpp:
void XYZ::func()
{
obj = std::move(maskfilename("abcd.txt"));
}
std::unique_ptr<ABC> XYZ::maskfilename(std::string filename)
{
std::unique_ptr<ABC> ret = std::make_unique<ABC>(filename);
// blah blah...
return ret;
}