gpt4 book ai didi

c++ - 使用 unique_ptr 和原始指针重载全局函数

转载 作者:行者123 更新时间:2023-12-01 14:39:48 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





C++ - compilation fails on calling overloaded function in std::thread

(2 个回答)


2年前关闭。




我一直在用 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/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) {}

有人可以帮助我理解这里有什么问题吗?

最佳答案

据我了解,编译器无法推断出您要使用哪些函数构造 std::thread 。有一个 std::overload 的建议我相信这会帮助你,但现在你可以做这样的事情:

std::thread t1([](auto&& x) { handleObj(std::forward<decltype(x)>(x)); }, std::move(obj));

关于c++ - 使用 unique_ptr 和原始指针重载全局函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60559139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com