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

使用线程可以覆盖我们需要跨越的功能的重载?

我有一个简单的类叫Complex.

class Complex
{
public:
    Complex():realPart_(0),imagPart_(0){}

    Complex(double rp,double ip) : realPart_(rp),imagPart_(ip) {}

    double & real() { return realPart_;}
    double & imag() { return imagPart_;}

    const double & real() const { return realPart_;}
    const double & imag() const { return imagPart_;}

    double square() const {return realPart_*realPart_ - imagPart_*imagPart_;}

    void display() const
    {
        std::cout << "Square of the Complex number (" << realPart_ << ") + i (" << imagPart_ << " ) is " << square() << std::endl;  
    }

    void display(unsigned nTimes) const {while(nTimes-- > 0)display();}

private:

    double realPart_;
    double imagPart_;

};

void Test3()
{
    Complex c1(1,0.74),c2(2,0.35);

    std::thread sqCalc1(&Complex::display,&c1);
    std::thread sqCalc2(&Complex::display,&c2);

    sqCalc1.join();
    sqCalc2.join();
}

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

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

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

解决方法

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

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

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

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

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

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

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...