Qt应用程序中的c ++ boost::thread() - 错误:函数参数过多

Posted

技术标签:

【中文标题】Qt应用程序中的c ++ boost::thread() - 错误:函数参数过多【英文标题】:c++ boost::thread() in Qt application - error: too many arguments to function 【发布时间】:2018-06-13 10:14:56 【问题描述】:

我正在尝试将 boost::thread 的功能集成到我的 Qt 应用程序中,但编译器会产生错误。我对 boost::thread 并不陌生,事实上,我在非 qt 应用程序中使用过很多次,但由于某种原因,我遇到了这个问题。这是确切的代码:

头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <boost/thread.hpp>

#include <QMainWindow>


namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

   Q_OBJECT

   public:
      explicit MainWindow(QWidget *parent = 0);
      ~MainWindow();

   private:
      Ui::MainWindow *ui;

      static void my_lengthly_method();
;

#endif // MAINWINDOW_H

源文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)

   ui->setupUi(this);

   boost::thread(&my_lengthly_method, this);


MainWindow::~MainWindow()

   delete ui;


void MainWindow::my_lengthly_method()



.pro 文件:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

INCLUDEPATH += $$PWD

TARGET = untitled
TEMPLATE = app

LIB_GLOBAL = /usr/lib/x86_64-linux-gnu

DEFINES += QT_DEPRECATED_WARNINGS  

SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

LIBS += \
   -L$$LIB_GLOBAL -lboost_system \
   -L$$LIB_GLOBAL -lboost_filesystem \
   -L$$LIB_GLOBAL -lboost_thread \
   -L$$LIB_GLOBAL -lboost_regex

我运行该项目并且:

/usr/include/boost/bind/bind.hpp:259: error: too many arguments to function
         unwrapper<F>::unwrap(f, 0)(a[base_type::a1_]);
         ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~

当您单击错误时,它会打开该文件,您会看到以下内容:

我之前在许多不同的非 Qt 项目中使用过这个很棒的库,我从来没有遇到过任何问题。有什么解决办法吗?

我所有的 API 都基于 boost::thread。

我可以使用 Qt 线程,但我不想。

无论如何,现在,我想让 boost 线程工作。

【问题讨论】:

试试boost::thread(boost::bind(&amp;my_lengthly_method, this)); 【参考方案1】:

my_lengthly_method 是静态方法,所以this 是多余的,只需调用

    boost::thread(&my_lengthly_method);

在上面的行中,您创建了一个临时线程对象,执行此行后,线程临时对象被销毁,在这个地方您可能会遇到问题,因为在 C++ 标准库中,当调用 std::thread 的析构函数而不调用 join on它std::terminate 被调用-您的应用程序已关闭。在 BOOST 中,这取决于您的库是如何构建的,如果使用定义 BOOST_THREAD_DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE,那么您的代码将起作用。但为了安全起见,您应该命名您的对象并调用deatch 方法。

     boost::thread myThread(&my_lengthly_method);
     myThread.detach();
 

【讨论】:

@marko 如果你有带有原型foo(int,double)的静态函数,你在指向函数成员的指针之后传递参数,所以调用thread th(&amp;foo,10,3.34f),当你想调用非静态成员时,你应该把this放在两者之间指向函数和参数的指针,所以调用thread th(&amp;foo,this,10,3.34f)。如果您想将类的对象作为参数传递,请阅读 boost::ref / boost::cref rafix07,关于传递非静态成员函数,当我尝试这样做时,我得到ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function 所以我选择了:static void my_lengthly_method(MainWindow *wnd);in 类声明然后boost::thread(&amp;my_lengthly_method, this); 有效正如预期的那样,在my_lengthly_method, *wnd); 我可以做我想做的事。这是一种解决方法,因为我未能将非静态成员函数传递给 boost:thread。如果有人知道这是怎么做到的,请指教。谢谢 @marko 哦,我错了,你必须输入&amp;ClassName::functionMember,所以打电话给&amp;MainWindow::my_lengthly_method 太好了,谢谢!这适用于不带参数的方法,例如,它编译得很好:void foo(); 然后 boost::thread(&amp;MainWindow::foo); 但以下失败:void foo2(int);boost::thread(&amp;MainWindow::foo2, 10); - 我想将 10 传递给 foo2 并失败: /usr/include/boost/bind/mem_fn.hpp:333: error: no matching function for call to ‘get_pointer(const int&amp;)’ - 如果您也能提供帮助,我将不胜感激。 @marko 看来foo2 是非静态成员,所以缺少this,请致电thread(&amp;MainWindow::foo2,this,10)

以上是关于Qt应用程序中的c ++ boost::thread() - 错误:函数参数过多的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 中的 C++ 中添加 C 函数时的构建问题

将自定义参数传递给 Qt/C++ 中的插槽

用 C++/Qt 编写的程序中的 RTF/doc/docx 文本提取

QT错误中的C ++线程亲和力

使用 QT/C++ 中的 DBUS 连接到新的 Bluez HDP 插件

如何从 C++/Qt 中的 .exe 和 .dlls 中读取图标(在 Windows 上)?