首页 > 解决方案 > 使用以 CWinThread 作为基础的类 operator()() 调用 std::thread 失败

问题描述

背景:

我的项目是C++ MFC. 但是随着标准的发展,我正在使用现代 C++ 编写代码。std::thread目前,我有时使用(后来的代码)调用线程,有时使用MFCCreateThread完成所需waitForSingleObject的线程优先级参数。显然,std::thread它更优雅,因此更易于维护。随着时间的推移,使代码保持一致并尽可能放弃旧的习惯用法很重要。

问题:

但是在下面的示例代码中调用std::thread一个以它为基础的类,找不到构造函数BazCWinThreadstd::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)...));
}

标签: c++mfcstdthread

解决方案


除非有人找到解决方法,否则暂定答案。

std::thread不能在MFC项目中用于继承自 的类类型CWinThread,也user threads可以在创建线程中找到示例代码。

worker threads对于调用 std::thread的传统窗口,它可以正常工作。


推荐阅读