error C3867 函数调用缺少参数列表(尝试启动线程时)

12 浏览
0 Comments

error C3867 函数调用缺少参数列表(尝试启动线程时)

我刚开始使用 C++ 11 的线程,但我一直在为一个(可能是傻的)错误而苦恼。

这是我的示例程序:

#include 
#include 
#include 
using namespace std;
class A {
public:
  A() {
    cout << "A constructor\n";
  }
  void foo() {
    cout << "我是 foo(),向你问好。\n";
  }
  static void foo2() {
    cout << "我是 foo2(),我是静态的!\n";
  }
  void operator()() {
    cout << "我是 operator()。嗨!\n";
  }
};
void hello1() {
  cout << "来自 A 类外的问候\n";
}
int main() {
  A obj;
  thread t1(hello1); // 运行正常
  thread t2(A::foo2); // 运行正常
  thread t3(&A::foo, &obj); // 错误
  thread t4(obj); // 运行正常
  t1.join();
  t2.join();
  t3.join();
  t4.join();
  return 0;
}

能否从一个纯成员函数开始一个线程?如果不行,我该如何包装我的 obj 对象中的 foo 函数以便能够创建这样的线程?

提前感谢!

这是编译错误:

thread_test.cpp: 在函数‘int main()’中:
thread_test.cpp:32:22: 错误:没有为‘std::thread::thread()’找到匹配的函数
thread_test.cpp:32:22: 注意:候选函数是:
/usr/include/c++/4.6/thread:133:7: 注意:std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (A::*)(), _Args = {}]
/usr/include/c++/4.6/thread:133:7: 注意:   无法从‘’转换为‘void (A::*&&)()’
/usr/include/c++/4.6/thread:128:5: 注意:std::thread::thread(std::thread&&)
/usr/include/c++/4.6/thread:128:5: 注意:   无法从‘’转换为‘std::thread&&’
/usr/include/c++/4.6/thread:124:5: 注意:std::thread::thread()
/usr/include/c++/4.6/thread:124:5: 注意:   候选函数希望0个参数,但提供了1个

0
0 Comments

问题的原因是调用线程时缺少参数列表。解决方法是使用可调用对象,该对象不接受任何参数,并且调用该对象时会调用A类的foo函数。

原因是A类的非静态成员函数会隐式地接受一个类型为A*的参数。当调用obj.foo()时,实际上是在调用A::foo(&obj)。了解了这一点后,上述代码就变得很容易理解了。

很抱歉重新发布了一个已存在的问题,可能我错过了正确的标签。顺便说一句,现在它可以工作了!

很高兴能帮到你。实际上,我刚意识到这个问题在重复问题中没有很好地解释清楚。

我理解了任何成员函数(非静态)都会隐式地接受该类型的第一个参数(该实例的this指针)。但是,如果我将对象作为参数传递给调用任何普通成员函数(例如A::foo(&obj)),为什么它不起作用?请告诉我更多关于这个问题的信息,任何关于这个概念的链接都可以。谢谢。

0