CProgressCtrl::CprogressCtrl(const CProgressCtrl &)"(隐式声明)不能被引用--它是一个被删除的函数
CProgressCtrl::CprogressCtrl(const CProgressCtrl &)"(declared implicitly) cannot be referenced -- it is a deleted function
我正在开发 MFC 对话框应用程序。我在对话框界面创建了一个进度控件(IDC_PROGRESSUPLOADING
),并为这个控件添加了一个变量m_progress
。 m_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 &)
不可用。
复制构造函数可以通过以下任一方式变得不可用
- 派生自具有不可用复制构造函数的 class。
- 正在使用
deleted
说明符声明复制构造函数。
- 正在声明一个未实现的用户定义复制构造函数。
这个声明错误的原因:
int start_update(CString path, CProgressCtrl progress)
是您按值传递 CProgressCtrl
。按值传递意味着将对对象进行复制。由于复制已关闭,您会收到错误消息。
解决这个问题的方法是通过引用传递:
int start_update(CString path, CProgressCtrl& progress)
或者单独保留声明并提供用户定义的复制构造函数。
我认为简单地通过引用传递就足以通过编译器错误。但同样,这是否会更新进度条——那是另一回事了。
我正在开发 MFC 对话框应用程序。我在对话框界面创建了一个进度控件(IDC_PROGRESSUPLOADING
),并为这个控件添加了一个变量m_progress
。 m_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 &)
不可用。
复制构造函数可以通过以下任一方式变得不可用
- 派生自具有不可用复制构造函数的 class。
- 正在使用
deleted
说明符声明复制构造函数。 - 正在声明一个未实现的用户定义复制构造函数。
这个声明错误的原因:
int start_update(CString path, CProgressCtrl progress)
是您按值传递 CProgressCtrl
。按值传递意味着将对对象进行复制。由于复制已关闭,您会收到错误消息。
解决这个问题的方法是通过引用传递:
int start_update(CString path, CProgressCtrl& progress)
或者单独保留声明并提供用户定义的复制构造函数。
我认为简单地通过引用传递就足以通过编译器错误。但同样,这是否会更新进度条——那是另一回事了。