c – 使用std :: thread调用重载的成员函数

前端之家收集整理的这篇文章主要介绍了c – 使用std :: thread调用重载的成员函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用线程可以覆盖我们需要跨越的功能的重载?

我有一个简单的类叫Complex.

  1. class Complex
  2. {
  3. public:
  4. Complex():realPart_(0),imagPart_(0){}
  5.  
  6. Complex(double rp,double ip) : realPart_(rp),imagPart_(ip) {}
  7.  
  8. double & real() { return realPart_;}
  9. double & imag() { return imagPart_;}
  10.  
  11. const double & real() const { return realPart_;}
  12. const double & imag() const { return imagPart_;}
  13.  
  14. double square() const {return realPart_*realPart_ - imagPart_*imagPart_;}
  15.  
  16. void display() const
  17. {
  18. std::cout << "Square of the Complex number (" << realPart_ << ") + i (" << imagPart_ << " ) is " << square() << std::endl;
  19. }
  20.  
  21. void display(unsigned nTimes) const {while(nTimes-- > 0)display();}
  22.  
  23. private:
  24.  
  25. double realPart_;
  26. double imagPart_;
  27.  
  28. };
  29.  
  30. void Test3()
  31. {
  32. Complex c1(1,0.74),c2(2,0.35);
  33.  
  34. std::thread sqCalc1(&Complex::display,&c1);
  35. std::thread sqCalc2(&Complex::display,&c2);
  36.  
  37. sqCalc1.join();
  38. sqCalc2.join();
  39. }

当我建立这个代码时,我收到错误.

  1. error C2661: 'std::thread::thread' : no overloaded function takes 2 arguments

如果没有重载的显示功能需要一个unsigned,那么我所显示代码工作正常.

解决方法

问题与std :: thread无关(错误是误导),可以通过重新排列代码显示
  1. auto memfunc = &Complex::display;
  2. std::thread sqCalc1(memfunc,&c1);
  3. std::thread sqCalc1(memfunc,&c2);

现在错误将在第一行,因为正如其他答案所说,& Complex :: display表达式是指一个重载的函数,编译器不知道你的意思.

您可以通过向演示者或类似的方式告知编译器要尝试调用函数的类型来选择所需的重载:

  1. void (Complex::*memfunc)() const = &Complex::display;
  2. std::thread sqCalc1(memfunc,&c2);

现在你明确地要求显示重载返回void并且不带参数.

如果您的编译器支持C 11别名声明,则可以使其更容易阅读:

  1. using memfunc_type = void (Complex::*)() const;
  2. memfunc_type memfunc = &Complex::display;
  3. std::thread sqCalc1(memfunc,&c2);

猜你在找的C&C++相关文章