【发布时间】: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。
问题出在哪里?
【问题讨论】:
-
使用 -std=c++11 模式编译。见stackoverflow.com/questions/17299139/…
-
CONFIG += c++11以防你使用 QMake