微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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);

原文地址:https://www.jb51.cc/c/113110.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐