CProgressCtrl::CprogressCtrl(const CProgressCtrl &)"(隐式声明)不能被引用--它是一个被删除的函数

CProgressCtrl::CprogressCtrl(const CProgressCtrl &)"(declared implicitly) cannot be referenced -- it is a deleted function

我正在开发 MFC 对话框应用程序。我在对话框界面创建了一个进度控件(IDC_PROGRESSUPLOADING),并为这个控件添加了一个变量m_progressm_progress 传递给函数 (start_update),该函数将设置和显示进度控件。

Dlg.h

...
public:
    afx_msg void OnStnClickedStaticFileName();
    afx_msg void OnEnChangeEditFilePath();
    afx_msg void OnBnClickedButtonSelectFile();
    afx_msg void OnStnClickedStaticFilePath();
    CString m_filepath;
    CProgressCtrl m_progress;
    afx_msg void OnBnClickedButtonStartUpdate();
...

Dlg.cpp

int start_update(CString path, CProgressCtrl progress) {
...
}
...
void CDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT_FILE_PATH, m_filepath);
    DDX_Control(pDX, IDC_PROGRESSUPLOADING, m_progress);
}
...
void CDlg::OnBnClickedButtonStartUpdate()
{
    start_update(m_filepath, m_progress);
}
...

但是Visual Studio告诉我有一个错误:

CProgressCtrl::CprogressCtrl(const CProgressCtrl &)"(declared implicitly) cannot be referenced -- it is a deleted function

你能帮忙解决这个问题吗?

您的 start_update() 函数采用其参数 按值 。所以,当你调用它时,编译器需要复制这两个参数——你不能复制一个 CProgressCtrl 对象。

可能,最简单的方法是将 start_update() 的第二个参数设为 reference(以及第一个 CString 参数,也可能不会造成伤害):

int start_update(CString& path, CProgressCtrl& progress) { // Pass args BY REFERENCE
    //...
}

只关注错误,基本上是这种类型的编译器错误:

SomeObject::SomeObject(const SomeObject &)"(declared implicitly) 
                              cannot be referenced -- it is a deleted function

表示SomeObject由于默认编译器的拷贝构造函数无法复制:

SomeObject::SomeObject(const SomeObject &)

不可用。

复制构造函数可以通过以下任一方式变得不可用

  1. 派生自具有不可用复制构造函数的 class。
  2. 正在使用 deleted 说明符声明复制构造函数。
  3. 正在声明一个未实现的用户定义复制构造函数。

这个声明错误的原因:

int start_update(CString path, CProgressCtrl progress)

是您按值传递 CProgressCtrl。按值传递意味着将对对象进行复制。由于复制已关闭,您会收到错误消息。

解决这个问题的方法是通过引用传递:

int start_update(CString path, CProgressCtrl& progress)

或者单独保留声明并提供用户定义的复制构造函数。

我认为简单地通过引用传递就足以通过编译器错误。但同样,这是否会更新进度条——那是另一回事了。