我正在使用c ++ 11连接语法,并使用此连接语句获得以下错误:
connect(fileSystemCompleter, &QCompleter::activated, [&] (QModelIndex index)
{
fileSystemPathEdit->setFocus(Qt::PopupFocusReason);
});
错误:
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
是否有可能以某种方式重写它,以便编译器能够消除重载函数的歧义?
编辑:
来自Qt Project ...
过载
正如您在示例中看到的那样,连接到QAbstractSocket :: error 因为错误有一个超载,并采取了 重载函数的地址需要显式转换。
某些宏可以提供帮助(使用c ++ 11或类型扩展)
最好的事情可能是建议不要过载信号或 插槽...
...但我们在过去的Qt版本中添加了重载 因为获取函数的地址不是我们的用例 支持。但是现在如果不打破源头就不可能做到这一点 兼容性。
任何想法究竟这个宏会是什么样子?或者如何进行显式投射?
答案 0 :(得分:8)
您必须显式转换重载指针:
void (QCompleter::* activatedOverloadPtr)(const QModelIndex&) = &QCompleter::activated;
connect(fileSystemCompleter, activatedOverloadPtr, [&] (QModelIndex index)
{
fileSystemPathEdit->setFocus(Qt::PopupFocusReason);
});