c++ - 使用以 CWinThread 作为基础的类 operator()() 调用 std::thread 失败
问题描述
背景:
我的项目是C++ MFC
. 但是随着标准的发展,我正在使用现代 C++ 编写代码。std::thread
目前,我有时使用(后来的代码)调用线程,有时使用MFCCreateThread
完成所需waitForSingleObject
的线程优先级参数。显然,std::thread
它更优雅,因此更易于维护。随着时间的推移,使代码保持一致并尽可能放弃旧的习惯用法很重要。
问题:
但是在下面的示例代码中调用std::thread
一个以它为基础的类,找不到构造函数。Baz
CWinThread
std::thread
示例代码:
struct Caz {};
struct Baz : public CWinThread // works if base is Caz
{
void operator()() {}
};
std::shared_ptr< Baz > b;
b = std::make_shared< Baz >();
std::thread bazThread( *b ); // error: can't find a constructor when CWinThread is base, but can for Caz as base
当基类是CWinThread
它时,它无法解析,但是当基类是它时,Caz
它工作正常。两者Caz
都有CWinThread
默认构造函数。
为什么CWinThread
让它失败?
编辑1:
错误消息集是:
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\memory(2057,35): 错误 C2665: 'std::tuple::tuple' : 2 个重载都不能转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\tuple(321,5):消息:可能是'std::tuple::tuple (std::tuple &&)'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\tuple(320,5): 消息: 或 'std::tuple::tuple( const std::tuple &)'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\memory(2056,59): 消息:尝试匹配参数列表时'(_Ty2 )'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\memory(2056,59):消息:使用
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\memory(2056,59):消息:[
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\memory(2056,59):消息:_Ty2=Baz 1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\memory(2056,59):消息:]
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\thread(53): 消息:见参考函数模板实例化 'std::unique_ptr< _Tuple,std::default_delete<_Ty>> std::make_unique<_Tuple,_Ty2&,0>(_Ty2 &)' 正在编译
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\thread(53):消息:使用
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\thread(53):消息:[
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\thread(53):消息:_Ty=_Tuple,
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\thread(53):消息:_Ty2=Baz
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\thread(53): 消息:]
1>E:\Hiveware\trunk\Windows\hives\Hiveware\SdcdcHiveware\GrammarSdcdcHiveware.cpp(153): 消息:见参考函数模板实例化'std::thread::thread<_Ty2&,,void>(_Fn)'正在编译
1>E:\Hiveware\trunk\Windows\hives\Hiveware\SdcdcHiveware\GrammarSdcdcHiveware.cpp(153):消息:与
1>E:\Hiveware\trunk\Windows\hives\Hiveware\SdcdcHiveware\GrammarSdcdcHiveware.cpp(153):消息:[
1>E:\Hiveware\trunk\Windows\hives\Hiveware\SdcdcHiveware\GrammarSdcdcHiveware.cpp(153):消息:_Ty2=Baz,
1>E:\Hiveware\trunk\Windows\hives\Hiveware\SdcdcHiveware\GrammarSdcdcHiveware.cpp(153):消息:_Fn=Baz &
1>E:\Hiveware\trunk\Windows\hives\Hiveware\SdcdcHiveware\GrammarSdcdcHiveware.cpp(153):消息:]
1>完成构建项目“SdcdcHiveware.vcxproj”——失败。
编辑2:
// FUNCTION TEMPLATE make_unique
template <class _Ty, class... _Types, enable_if_t<!is_array_v<_Ty>, int> = 0>
_NODISCARD unique_ptr<_Ty> make_unique(_Types&&... _Args) { // make a unique_ptr
return unique_ptr<_Ty>(new _Ty(_STD forward<_Types>(_Args)...));
}
解决方案
除非有人找到解决方法,否则暂定答案。
std::thread
不能在MFC
项目中用于继承自 的类类型CWinThread
,也user threads
可以在创建线程中找到示例代码。
worker threads
对于调用 std::thread的传统窗口,它可以正常工作。
推荐阅读
- node.js - 在数组中查找特定文档
- c - 宏中“{”标记之前的预期表达式
- python - 带有限制的烧瓶restful api动态端点
- arrays - 设置阈值以触发或停止对 C 中的数据点求和
- amazon-web-services - 在 AWS 上同时运行节点 Lambda 和 C# Lambda
- swift - 将连续数据(如心率)从 ViewController 传递到另一个 ViewController
- google-chrome-extension - 内容脚本与谷歌浏览器扩展上的其他内容脚本通信的更短方式?
- python - 这个 TypeError 来自哪里?(将肌动蛋白用于恒星活动指数)类型错误:预期的 str、字节或 os.PathLike 对象,而不是 bool
- python - 在装饰器函数中返回包装器
- python - Python Flask CSRF 会话令牌丢失(Chrome Web 浏览器)