我想在與我的 Qt 應用程式中的 GUI 執行緒不同的執行緒中運行簡單的方法。為此,我使用QFuture和Qt Concurrent。但是,我遇到了編譯錯誤:
C:\Qt\5.15.2\msvc2019_64\include\QtConcurrent/qtconcurrentstoredfunctioncall.h(58): error C2280: 'QtConcurrent::RunFunctionTask<T>::RunFunctionTask(void)': attempting to reference a deleted function
with
[
T=Error
]
C:\Qt\5.15.2\msvc2019_64\include\QtConcurrent/qtconcurrentrunbase.h(121): note: compiler has generated 'QtConcurrent::RunFunctionTask<T>::RunFunctionTask' here
with
[
T=Error
]
C:\Qt\5.15.2\msvc2019_64\include\QtConcurrent/qtconcurrentrunbase.h(121): note: 'QtConcurrent::RunFunctionTask<T>::RunFunctionTask(void)': function was implicitly deleted because a data member 'QtConcurrent::RunFunctionTask<T>::result' has either no appropriate default constructor or overload resolution was ambiguous
with
[
T=Error
]
C:\Qt\5.15.2\msvc2019_64\include\QtConcurrent/qtconcurrentrunbase.h(120): note: see declaration of 'QtConcurrent::RunFunctionTask<T>::result'
with
[
T=Error
]
C:\Qt\5.15.2\msvc2019_64\include\QtConcurrent/qtconcurrentstoredfunctioncall.h(58): note: while compiling class template member function 'QtConcurrent::StoredFunctorCall0<T,T (__cdecl *)(void)>::StoredFunctorCall0(FunctionPointer)'
with
[
T=Error,
FunctionPointer=Error (__cdecl *)(void)
]
C:\Qt\5.15.2\msvc2019_64\include\QtConcurrent\qtconcurrentrun.h(74): note: see reference to function template instantiation 'QtConcurrent::StoredFunctorCall0<T,T (__cdecl *)(void)>::StoredFunctorCall0(FunctionPointer)' being compiled
with
[
T=Error,
FunctionPointer=Error (__cdecl *)(void)
]
C:\Qt\5.15.2\msvc2019_64\include\QtConcurrent\qtconcurrentrun.h(74): note: see reference to class template instantiation 'QtConcurrent::StoredFunctorCall0<T,T (__cdecl *)(void)>' being compiled
with
[
T=Error
]
C:\Users\dalji\Documents\Dev\TestQtConcurrent\main.cpp(37): note: see reference to function template instantiation 'QFuture<Error> QtConcurrent::run<Error>(T (__cdecl *)(void))' being compiled
with
[
T=Error
]
ninja: build stopped: subcommand failed.
16:14:59: The process "C:\Qt\Tools\CMake_64\bin\cmake.exe" exited with code 1.
Error while building/deploying project TestQtConcurrent (kit: Desktop Qt 5.15.2 MSVC2019 64bit)
When executing step "Build"
這是一個簡單的測驗應用程式,它重現了我遇到的問題
#include <QCoreApplication>
#include <QFuture>
#include <QtConcurrent/QtConcurrent>
class Error
{
public:
enum class ErrorType {
NoError,
FileSavingError,
FileLoadingError
};
Error(ErrorType errorType, const QString &errorMessage = "") :
m_errorType(errorType),
m_errorMessage(errorMessage)
{
}
const QString &errorMessage() const { return m_errorMessage; }
ErrorType errorType() const { return m_errorType; }
private:
ErrorType m_errorType;
QString m_errorMessage;
};
Error testMethod(){
return Error(Error::ErrorType::NoError, "No Error");
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFuture<Error> errorFuture = QtConcurrent::run(testMethod);
return a.exec();
}
我究竟做錯了什么?
uj5u.com熱心網友回復:
正如評論中所指出的,并且如錯誤訊息本身所示,問題在于您的Error類沒有默認建構式。
雖然檔案QtConcurrentRun中沒有明確表明此要求,但QFuture(粗體強調我的)1的檔案中有以下內容:
QFuture 允許執行緒與一個或多個結果同步,這些結果將在稍后的時間點準備好。結果可以是 具有默認建構式和復制建構式的任何型別。…
將所需的默認建構式添加到Error類中的最簡單方法是在當前定義的建構式中為第一個引數(第二個引數已經有一個)添加一個默認值(我假設ErrorType::NoError列舉是一個合理的值對于此默認值):
Error(ErrorType errorType = ErrorType::NoError, const QString& errorMessage = "") :
m_errorType(errorType),
m_errorMessage(errorMessage)
{
}
1請注意,對于您的Error類,(也是必需的)復制建構式是隱式宣告的,并將由編譯器為您生成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434946.html
