Nic*_*aus 5 c++ lambda qt c++11
我正在使用c ++ 11连接语法,并使用此connect语句获得以下错误:
connect(fileSystemCompleter, &QCompleter::activated, [&] (QModelIndex index)
{
fileSystemPathEdit->setFocus(Qt::PopupFocusReason);
});
Run Code Online (Sandbox Code Playgroud)
错误:
error C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const char *,Qt::ConnectionType) const' : cannot convert parameter 2 from 'overloaded-function' to 'const char *'
Context does not allow for disambiguation of overloaded function
Run Code Online (Sandbox Code Playgroud)
是否有可能以某种方式重写它,以便编译器能够消除重载函数的歧义?
编辑:
从Qt项目......
超载
正如您在示例中看到的那样,连接到QAbstractSocket :: error并不是很漂亮,因为错误有重载,并且获取重载函数的地址需要显式转换.
一些宏可以帮助(使用c ++ 11或typeof扩展)
最好的事情可能是建议不要过载信号或插槽......
...但是我们在过去的Qt次要版本中添加了重载,因为获取函数的地址不是我们支持的用例.但是,如果不打破源兼容性,这将是不可能的.
有什么想法这个宏究竟是什么样的?或者如何进行显式投射?
你必须显式地转换重载指针:
void (QCompleter::* activatedOverloadPtr)(const QModelIndex&) = &QCompleter::activated;
connect(fileSystemCompleter, activatedOverloadPtr, [&] (QModelIndex index)
{
fileSystemPathEdit->setFocus(Qt::PopupFocusReason);
});
Run Code Online (Sandbox Code Playgroud)