我一直在开发c ++的功能,该功能使用了一些用C语言编写的旧代码。
我在使用unique_ptr
或相同类型的原始指针的函数的重载版本时遇到编译器错误。>>
下面是我代码的简化版:
class A{ public: A():mDummy(0) { } ~A()=default; int mDummy; }; void handleObj(std::unique_ptr<A> ap){ std::cout<<ap->mDummy<<'\n'; } void handleObj(A* ap){ std::cout<<ap->mDummy<<'\n'; } int main(){ std::unique_ptr<A> obj{new A()}; std::thread t1{handleObj, std::move(obj)}; A* obj2{ new A()}; std::thread t2{handleObj, obj2}; if(t1.joinable()) t1.join(); if(t2.joinable()) t2.join(); }
编译时出现此错误:
/Users/dsatram/Desktop/overload_uniquePtr_rawPtr/main.cpp:29:17: error: no matching constructor for initialization of 'std::thread' std::thread t1{handleObj, std::move(obj)}; ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/thread:359:9: note: candidate template ignored: couldn't infer template argument '_Fp' thread::thread(_Fp&& __f, _Args&&... __args) ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/thread:289:5: note: candidate constructor not viable: requires 1 argument, but 2 were provided thread(const thread&); ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/thread:315:5: note: candidate constructor not viable: requires single argument '__t', but 2 arguments were provided thread(thread&& __t) _NOEXCEPT : __t_(__t.__t_) {__t.__t_ = _LIBCPP_NULL_THREAD;} ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/thread:296:5: note: candidate constructor not viable: requires 0 arguments, but 2 were provided thread() _NOEXCEPT : __t_(_LIBCPP_NULL_THREAD) {}
有人可以帮助我了解这里出了什么问题吗?
我一直在开发c ++的功能,该功能使用一些用C语言编写的旧代码。我一直在遇到带有重载版本的函数的编译器错误,该函数采用unique_ptr或raw ...
据我了解,编译器无法推断出您要使用std :: thread构造哪些函数。有一个关于std::overload
的建议,我认为它可以帮助您,但是现在您可以执行以下操作: