【问题标题】:CProgressCtrl::CprogressCtrl(const CProgressCtrl &)"(declared implicitly) cannot be referenced -- it is a deleted functionCProgressCtrl::CprogressCtrl(const CProgressCtrl &)"(隐式声明)不能被引用——它是一个被删除的函数
【发布时间】:2021-06-09 01:59:34
【问题描述】:

我正在开发 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 &)"(已声明 隐式)不能被引用——它是一个被删除的函数

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

【问题讨论】:

  • 请张贴start_update的声明。参数类型有哪些?你是按值传递CProgressCtrl 吗?
  • @PaulMcKenzie,非常感谢您的 cmets。我在问题中添加了声明。

标签: c++ visual-studio mfc


【解决方案1】:

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

可能,解决此问题的最简单方法是将start_update() 的第二个参数设为引用(第一个参数CString 也可能没有害处):

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

【讨论】:

    【解决方案2】:

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

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

    表示由于默认编译器的复制构造函数,SomeObject不能被复制:

    SomeObject::SomeObject(const SomeObject &)

    不可用。

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

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

    此声明中发生错误的原因:

    int start_update(CString path, CProgressCtrl progress)

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

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

    int start_update(CString path, CProgressCtrl& progress)

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

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

    【讨论】:

    • 但是,这会更新进度条 为什么不呢?按值传递(如果允许)可能不会,因为它会更新副本。
    • @AdrianMole 只是一个警告,这会修复编译器错误。程序运行时会发生什么,我不希望问题和答案滚雪球成更多问题。另外,我不是 MFC 大师。
    • 很公平。但是通过引用传递是将 MFC 控件发送到成员函数的“正常”方式,如对 DDX_Control 的调用(采用 CWnd& 第三个参数)。
    猜你喜欢
    • 2020-08-09
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2013-09-24
    相关资源
    最近更新 更多