Фон:
Мой проект C++ MFC
. Но я пишу код, используя современный C ++ по мере развития стандарта. В настоящее время я вызываю потоки, иногда используя std::thread
(более поздний код), а иногда MFC CreateThread
с обязательным 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
вызывает сбой?
Edit1:
Сообщение об ошибкеустанавливается:
1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ memory (2057,35):ошибка C2665: 'std :: tuple :: tuple': ни одна из двух перегрузок не может преобразовать все типы аргументов
1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC\ Tools \ MSVC \ 14.23.28105 \ include \ tuple (321,5): message: может быть 'std :: tuple :: tuple (std :: tuple &&)'
1> C: \ ProgramФайлы (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ tuple (320,5): message: или '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): message:]
1> E: \ Hiveware \ trunk \ Windows \ hives \ Hiveware \ SdcdcHiveware \ GrammarSdcdcHiveware.cpp (153): message: см. ссылку на создание шаблона функции '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 15) (сообщение):]
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)...));
}