当前位置: 首页 > 知识库问答 >
问题:

C++11线程初始化成员函数编译错误[重复]

景元忠
2023-03-14
#include <iostream>
#include <thread>
#include <future>
using namespace std;

class A {
public:
  A() {
    cout << "A constructor\n";
  }

  void foo() {
    cout << "I'm foo() and I greet you.\n";
  }

  static void foo2() {
    cout << "I'm foo2() and I am static!\n";
  }

  void operator()() {
    cout << "I'm the operator(). Hi there!\n";
  }
};

void hello1() {
  cout << "Hello from outside class A\n";
}

int main() {
  A obj;
  thread t1(hello1); //  it works
  thread t2(A::foo2); // it works
  thread t3(obj.foo); // error
  thread t4(obj);     // it works

  t1.join();
  t2.join();
  t3.join();
  t4.join();
  return 0;
}

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/线程:133:7:注意:参数1从''到'void(A::*&)()'没有已知的转换

/usr/include/c++/4.6/thread:128:5:注意:std::thread::thread(std::thread&&)

/usr/include/c++/4.6/thread:128:5:注意:参数1从''到'std::thread&&'没有已知的转换

共有1个答案

乜栋
2023-03-14

您需要一个不带参数的可调用对象,所以

thread t3(&A::foo, &obj);

应该能做到这一点。其效果是创建一个可调用实体,该实体调用OBJ上的a::foo

原因是a的非静态成员函数采用隐式的第一个参数类型(可能是cv限定的)a*。当您调用obj.foo()时,实际上是在调用A::foo(&obj)。一旦你知道了这一点,上面的咒语就完全有道理了。

 类似资料:
  • 我想在C++11中使用多线程来调用一个类成员函数在它自己的线程中。我已经能够让它与全局函数一起工作:

  • 我在Eclipse中编写代码,有如下内容: 但是,当我尝试构建时,会出现以下错误: 有什么想法吗?我在谷歌上搜索过,似乎大多数有这个问题的人根本没有包含正确的头文件,我相信我做得是正确的。

  • 问题内容: 我最近刚与Python中的一个错误作斗争。那是那些愚蠢的新手错误之一,但是它让我思考了Python的机制(我是C ++的老程序员,是Python的新手)。我将列出错误的代码并解释如何解决该问题,然后我有两个问题。 场景:我有一个叫做A的类,它有一个字典数据成员,下面是其代码(当然这是简化的): 使用此代码的类为B类: 请注意,每次调用都会初始化类A的新“干净”实例,并在添加前后打印字典

  • 我试图理解@bolov对删除默认构造函数问题的第一个公认答案。对象仍然可以创建......有时[1] 似乎我发现了一个错误,所以它搞乱了整个解释。 @bolov解释了为什么这段代码能够在c 11中成功编译: 场景A 以及为什么这段代码无法在c 11中编译: 场景C 他说,重点是第一个foo是聚合,第二个foo不是聚合。 然后他给出了cppreference的摘录: T类型对象的列表初始化的影响是:

  • 下面的代码不断抛出以下错误:Java Error Terminal Screen Snapshot 我试过很多在线修复,但似乎都不起作用。下面是我的代码,我已经注释了错误位置(发生在驱动程序主函数中) 注意:如果我将public static void main(String args[])更改为public void main(String args[]),那么代码可以正常编译,但是当我运行它时

  • 为什么定义num时初始化或者用初始化函数Stu_t都会导致报错? 是不是意味着 union 内所有的成员以及嵌套的所有成员都不能在定义时初始化和使用构造函数呢? 如果不让初始化则会不会导致内存里是随机数据呢? 对 union 内成员逐层嵌套的成员进行定义时初始化和使用构造函数验证,发现都会报错。