error C3867 函数调用缺少参数列表(尝试启动线程时)
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个
问题的原因是调用线程时缺少参数列表。解决方法是使用可调用对象,该对象不接受任何参数,并且调用该对象时会调用A类的foo函数。
原因是A类的非静态成员函数会隐式地接受一个类型为A*的参数。当调用obj.foo()时,实际上是在调用A::foo(&obj)。了解了这一点后,上述代码就变得很容易理解了。
很抱歉重新发布了一个已存在的问题,可能我错过了正确的标签。顺便说一句,现在它可以工作了!
很高兴能帮到你。实际上,我刚意识到这个问题在重复问题中没有很好地解释清楚。
我理解了任何成员函数(非静态)都会隐式地接受该类型的第一个参数(该实例的this指针)。但是,如果我将对象作为参数传递给调用任何普通成员函数(例如A::foo(&obj)),为什么它不起作用?请告诉我更多关于这个问题的信息,任何关于这个概念的链接都可以。谢谢。