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(&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(&foo,10,3.34f)
,当你想调用非静态成员时,你应该把this
放在两者之间指向函数和参数的指针,所以调用thread th(&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(&my_lengthly_method, this);
有效正如预期的那样,在my_lengthly_method, *wnd);
我可以做我想做的事。这是一种解决方法,因为我未能将非静态成员函数传递给 boost:thread。如果有人知道这是怎么做到的,请指教。谢谢
@marko 哦,我错了,你必须输入&ClassName::functionMember
,所以打电话给&MainWindow::my_lengthly_method
。
太好了,谢谢!这适用于不带参数的方法,例如,它编译得很好:void foo();
然后 boost::thread(&MainWindow::foo);
但以下失败:void foo2(int);
和 boost::thread(&MainWindow::foo2, 10);
- 我想将 10 传递给 foo2 并失败: /usr/include/boost/bind/mem_fn.hpp:333: error: no matching function for call to ‘get_pointer(const int&)’
- 如果您也能提供帮助,我将不胜感激。
@marko 看来foo2
是非静态成员,所以缺少this
,请致电thread(&MainWindow::foo2,this,10)
。以上是关于Qt应用程序中的c ++ boost::thread() - 错误:函数参数过多的主要内容,如果未能解决你的问题,请参考以下文章
用 C++/Qt 编写的程序中的 RTF/doc/docx 文本提取