C++ - 在 std::thread 中调用重载函数时编译失败

标签 c++

考虑以下场景:

//utils.h

#include <string>
#include <list>

namespace Utils {
    void do_something(int a, std::list<int> *b);
    void do_something(int a, std::list<std::string> *b);
};

//utils.cpp

#include "utils.h"

void Utils::do_something(int a, std::list<int> *b) {

}

void Utils::do_something(int a, std::list<std::string> *b) {

}

// main.cpp

#include <thread>
#include <list>
#include "utils.h"

int main() {
    std::list<int> list;
    std::thread t(Utils::do_something, 17, &list);
    t.join();
    return 0;
}

编译时出现如下错误:

error: no matching function for call to 'std::thread::thread(<unresolved overloaded function type>, int, std::list<int>*)'

知道我做错了什么吗?在我添加获取 std::list<std::string>* 的重载函数之前,它确实编译得很好。

最佳答案

这里的问题是,即使您将参数传递给 std::thread,它也不会使用这些参数来尝试确定传递给它的函数。它试图单独解析函数类型。当它这样做时,它发现有两个不同的版本,所以它停止了,因为它不知道你想要哪个。

不幸的是,您将不得不告诉编译器您要使用哪个函数。您可以通过将函数强制转换为您想要的特定函数指针来实现。

尽管您可以使用 lambda 来简化此操作,方法是允许在常规函数调用中进行重载解析,例如

std::thread t([](auto first, auto second){ return Utils::do_something(first, second); }, 17, &list);

这也适用于成员函数,因为您只需使用 lambda 的捕获列表捕获要调用函数的对象。这使您不必将该对象传递给 std::thread 或使用 std::bind

关于C++ - 在 std::thread 中调用重载函数时编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44049407/

相关文章:

python - OpenCV 3 在 37% 时构建问题?

c++ - 保存源函数的最佳方式

c++ - 可以轮询标准 C++ iostream 操纵器的状态吗?

c++ - std::cspan 发生了什么?

c++ - 我无法创建虚幻引擎 4 c++ 项目

C++0x 智能指针比较 : Inconsistent, 原理是什么?

c++ - 为什么我的(重新)实现 strlen 是错误的?

c++ - 循环遍历以结构为键的 map 。

c++ - 检查(原始)类型在 C++ 中是否可转换

c++ - SetWindowPos() 跨进程处理多个监视器和不同的显示比例