std::thread::thread(<未解析的重载函数类型>) in Qt

std::thread::thread(<unresolved overloaded function type>) in Qt

本文关键字:thread 类型 函数 gt in Qt 重载 lt std      更新时间:2023-10-16

我在这个网站上看到的其他答案似乎与我的问题无关。无论如何,在我的mainwindow.cpp文件中,我有一个需要访问ui命名空间的函数:

 do
    {
        intrecv= recv(s1, buffer, 10000,0);
        if(intrecv > 0)
        {
            recvData = buffer;
            ui->textEdit->setText("Connection occurred.n");
        }   
    }while(intrecv > 0);

下面是我的预处理器命令:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <thread>
#include <string>
#include <QString>

在mainwindow.h文件中,我将接收函数原型化如下:

    class MainWindow : public QMainWindow
{
    Q_OBJECT
    void receiveFunction();
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_pushButton_clicked();
    void on_lineEdit_returnPressed();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

然后,在mainwindow.cpp中,我在另一个函数的线程中调用了接收函数:

    void MainWindow::on_pushButton_clicked()
{
    connectFunction();
    std::thread t1(receiveFunction);
    t1.detach();
}

一个例子,你可以尝试复制我的问题是做一个按钮和一个textit字段。让按钮插槽调用一个编辑texttedit字段的函数。

edit:我忘了提到:对于我的迷你示例,不只是让它编辑texttedit字段,让它接收数据并编辑texttedit字段。

错误消息似乎暗示reveiveFunction函数有多个重载,但这可能会产生误导(如果上面的代码是正确的)。这一行有两处本质上是错误的:

std::thread t1(receiveFunction);

首先,不能在不提供类型限定的情况下获取成员函数的地址(并且成员函数不会衰变为指向成员函数的指针)。第二个问题是,非静态成员函数需要调用它的对象,而您没有提供该对象。该语句可以通过以下操作修复:

std::thread t1(&MainWindow::receiveFunction, this);

这将正确地接受成员函数的地址,并提供this指针,函数将在该指针上求值。

相关文章: