【问题标题】:Compiling with gcc fails if using lambda function for QObject::connect()如果对 QObject::connect() 使用 lambda 函数,则使用 gcc 编译会失败
【发布时间】:2014-03-08 01:23:53
【问题描述】:

此代码编译Qt5.2.0 MSVC2012没有任何问题:

#include <QCoreApplication>
#include <QObject>
#include <QTimer>
#include <QDebug>

int main(int argc, char *argv[])
{
    QTimer timer;
    QCoreApplication a(argc, argv);

    QObject::connect(&timer, &QTimer::timeout,
            [=] () {
       qDebug() << Q_FUNC_INFO;
    });

    timer.start(1000);

    return a.exec();
}

但如果我尝试使用 gcc 使用 Qt5.2.0 编译它,我会收到以下错误:

../_test_gccLambda/main.cpp:在函数'int main(int,char**)'中: ../_test_gccLambda/main.cpp:14:5:警告:lambda 表达式仅适用于 -std=c++11 或 -std=gnu++11 [默认启用] }); ^ ../_test_gccLambda/main.cpp:14:6: 错误: 没有匹配函数调用'QObject::connect(QTimer*, void (QTimer::)(QTimer::QPrivateSignal), main(int,字符*)::__lambda0)' }); ^ ../_test_gccLambda/main.cpp:14:6: 注意:候选人是: 在 ../../Qt5/5.2.0/gcc_64/include/QtCore/qcoreapplication.h:48:0 包含的文件中, 来自../../Qt5/5.2.0/gcc_64/include/QtCore/QCoreApplication:1, 来自../_test_gccLambda/main.cpp:1: ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:198:36: 注意:静态 QMetaObject::Connection QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType) 静态 QMetaObject::Connection connect(const QObject *sender, const char *signal, ^ ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:198:36:注意:候选人需要5个参数,提供3个 ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:201:36: 注意:静态 QMetaObject::Connection QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType) 静态 QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal, ^ ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:201:36:注意:候选人需要5个参数,提供3个 ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:479:32: 注意:QMetaObject::Connection QObject::connect(const QObject*, const char*, const char*, Qt ::ConnectionType) 常量 内联 QMetaObject::Connection QObject::connect(const QObject *asender, const char *asignal, ^ ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:479:32:注意:从 'void (QTimer::)(QTimer::QPrivateSignal )' 到 'const char' ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:215:43: 注意:模板静态 QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, 常量类型名 QtPrivate::FunctionPointer::Object*, Func2, Qt::ConnectionType) 静态内联 QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer::Object *sender, Func1 信号, ^ ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:215:43:注意:模板参数扣除/替换失败: ../_test_gccLambda/main.cpp:14:6:注意:不匹配的类型 'const typename QtPrivate::FunctionPointer::Object*' 和 'main(int, char**)::__lambda0' }); ^ 在 ../../Qt5/5.2.0/gcc_64/include/QtCore/qcoreapplication.h:48:0 包含的文件中, 来自../../Qt5/5.2.0/gcc_64/include/QtCore/QCoreApplication:1, 来自../_test_gccLambda/main.cpp:1: ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:247:13: 注意:模板静态类型名 QtPrivate::QEnableIf = 0), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, Func2) 连接(常量类型名 QtPrivate::FunctionPointer::Object *sender,Func1 信号,Func2 插槽) ^ ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:247:13:注意:模板参数扣除/替换失败: ../_test_gccLambda/main.cpp:代替'模板静态类型名QtPrivate::QEnableIf= 0), QMetaObject::Connection>::Type QObject:: connect(const typename QtPrivate::FunctionPointer::Object*, Func1, Func2) [with Func1 = void (QTimer::)(QTimer::QPrivateSignal); Func2 = main(int, char*)::__lambda0]': ../_test_gccLambda/main.cpp:14:6: 从这里需要 ../_test_gccLambda/main.cpp:14:6: 错误:'template static typename QtPrivate::QEnableIf= 0), QMetaObject::Connection> 的模板参数::Type QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, Func2)' 使用本地类型 'main(int, char**)::__lambda0' }); ^ ../_test_gccLambda/main.cpp:14:6: 错误:试图实例化'模板静态类型名 QtPrivate::QEnableIf= 0), QMetaObject::Connection> ::Type QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, Func2)' 在 ../../Qt5/5.2.0/gcc_64/include/QtCore/qcoreapplication.h:48:0 包含的文件中, 来自../../Qt5/5.2.0/gcc_64/include/QtCore/QCoreApplication:1, 来自../_test_gccLambda/main.cpp:1: ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:256:13:注意:模板静态类型名QtPrivate::QEnableIf= 0) && (!QtPrivate::FunctionPointer::IsPointerToMemberFunction)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, const QObject*, Func2, Qt ::连接类型) connect(const typename QtPrivate::FunctionPointer::Object *sender, Func1 信号, const QObject *context, Func2 slot, ^ ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:256:13:注意:模板参数扣除/替换失败: ../_test_gccLambda/main.cpp:14:6: 注意:不能将 'main(int, char**)::__lambda0{}' (type 'main(int, char**)::__lambda0') 转换为 type '常量 QObject*' }); ^ 在 ../../Qt5/5.2.0/gcc_64/include/QtCore/qcoreapplication.h:48:0 包含的文件中, 来自../../Qt5/5.2.0/gcc_64/include/QtCore/QCoreApplication:1, 来自../_test_gccLambda/main.cpp:1: ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:287:13:注意:模板静态类型名QtPrivate::QEnableIf::Type QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, Func2) 连接(常量类型名 QtPrivate::FunctionPointer::Object *sender,Func1 信号,Func2 插槽) ^ ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:287:13:注意:模板参数扣除/替换失败: ../_test_gccLambda/main.cpp:代替'模板静态类型名QtPrivate::QEnableIf::Type QObject::connect( const typename QtPrivate::FunctionPointer::Object*, Func1, Func2) [with Func1 = void (QTimer::)(QTimer::QPrivateSignal); Func2 = main(int, char*)::__lambda0]': ../_test_gccLambda/main.cpp:14:6: 从这里需要 ../_test_gccLambda/main.cpp:14:6: 错误:'template static typename QtPrivate::QEnableIf:: 的模板参数类型 QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, Func2)' 使用本地类型 'main(int, char**)::__lambda0' }); ^ ../_test_gccLambda/main.cpp:14:6: 错误:试图实例化'模板静态类型名 QtPrivate::QEnableIf::类型 QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, Func2)' 在 ../../Qt5/5.2.0/gcc_64/include/QtCore/qcoreapplication.h:48:0 包含的文件中, 来自../../Qt5/5.2.0/gcc_64/include/QtCore/QCoreApplication:1, 来自../_test_gccLambda/main.cpp:1: ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:295:13:注意:模板静态类型名QtPrivate::QEnableIf::Type QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, const QObject*, Func2, Qt::ConnectionType) connect(const typename QtPrivate::FunctionPointer::Object *sender, Func1 信号, const QObject *context, Func2 slot, ^ ../../Qt5/5.2.0/gcc_64/include/QtCore/qobject.h:295:13:注意:模板参数扣除/替换失败: ../_test_gccLambda/main.cpp:14:6: 注意:不能将 'main(int, char**)::__lambda0{}' (type 'main(int, char**)::__lambda0') 转换为 type '常量 QObject*' }); ^ make: * [main.o] 错误 1 16:53:24:进程“/usr/bin/make”以代码 2 退出。 构建/部署项目 _test_gccLambda 时出错(套件:Desktop Qt 5.2.0 GCC 64bit) 执行步骤“制作”时 16:53:24:经过时间:00:02。

问题出在哪里?

【问题讨论】:

标签: c++ qt gcc c++11 lambda


【解决方案1】:

如 cmets 中所回答,使用 -std=c++11 使其与 gcc 一起编译

【讨论】:

  • 我不确定一个表明缺乏基本阅读理解或语言意识的问题需要答案。但是,当您发布其他人的评论作为答案时,您至少可以解释所需的一切(即在某些情况下包括 QMake 配置)以及原因。
  • 老实说,我尝试按照元堆栈溢出中建议的程序进行操作;当响应在 cmets 上时(给出答案并放置社区 wiki)。我同意你的观点,而且我确实希望能够报告这个问题太蹩脚,但似乎没有这样的标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
相关资源
最近更新 更多