【问题标题】:C++ - compilation fails on calling overloaded function in std::threadC++ - 在 std::thread 中调用重载函数时编译失败
【发布时间】:2020-03-06 21:43:38
【问题描述】:

考虑以下场景:

// 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&lt;std::string&gt;* 的重载函数之前,它确实编译得很好。

【问题讨论】:

  • 这两个 Utils::do_something 函数是否(大致)做同样的事情?如果不是,那么使用不同的(并且更具描述性的)函数名称将解决它。
  • 这是一个显而易见的解决方案,我完全同意你的看法。但是,线程不能接受重载函数是一个记录在案的问题吗?
  • 我怀疑期望编译器可以仅根据其余参数的类型推断出第一个参数的正确重载有点牵强,但希望有人能够引用标准为什么不能(或可以)做到这一点。有趣的问题。
  • @SomethingSomething 它比这更广泛:所有需要泛型函子的东西都会在完整的重载集(或函数模板)上窒息。 std::thread&lt;algorithm&gt; 函数等
  • Qt 有一个相关的函数 qOverload 用于不是 Qt 特定的。

标签: c++


【解决方案1】:

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

不幸的是,您将不得不告诉编译器您要使用哪个函数。您可以通过将函数转换为所需的特定函数指针来做到这一点。

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

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

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

【讨论】:

  • 好吧,我们并没有真正告诉在那里使用哪个函数 - 相反,这会延迟自动重载解析,因此它可以使用提供的参数:)
  • @Quentin 更新了语言。谢谢。
【解决方案2】:

您可以使用static_cast 来消除重载的歧义...

std::thread t(static_cast<void(*)(int, std::list<int> *)>(&Utils::do_something), 17, &list);

【讨论】:

  • 谢谢。实际上,如果我需要手动指定签名,我会更喜欢使用不同命名函数的“明显解决方案”。问题是是否还有其他事情要做
猜你喜欢
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多