class Foo
{
public:
void method(int a,float b)
{
cout<<"This method takes float and int";
}
void method(char a,char b)
{
cout<<"This method takes two characters";
}
};
在具有上述功能的重载类中,使用 boost :: thread newThread(&amp; Foo :: method,foo_obj_ptr,a,b)创建一个线程会引发错误&#34 ;没有重载函数需要四个参数&#34; 。 [我已经声明了a和b只作为字符。]我的假设是,使用重载函数boost :: thread无法正确绑定。有什么解决方案吗?
我在vs2010上使用了boost 1.54。
答案 0 :(得分:4)
它与boost无关,而是让编译器了解调用重载函数时所指的函数(在新线程中或其他情况下)。
以下是您的代码+使用std::thread
的解决方案(无主要区别):
#include <thread>
#include <iostream>
using namespace std;
class Foo
{
public:
void method(int a,float b)
{
cout<<"This method takes float and int";
}
void method(char a,char b)
{
cout<<"This method takes two characters";
}
};
int main()
{
Foo foo;
typedef void (Foo::*fn)(char, char);
thread bar((fn)(&Foo::method), &foo, 2, 3);
}
注意
typedef void (Foo::*fn)(char, char);
允许您将第一个参数转换为thread
:
thread bar((fn)(&Foo::method), &foo, 'b', 'c');
这个演员告诉编译器你指的是哪个函数。
答案 1 :(得分:2)
使用lambda函数,只需要两个char
s
int main()
{
Foo foo;
thread yay([&foo](char a, char b){ foo.method(a, b); }, 2, 3);
yay.join();
}