【问题标题】:Qt connect function - signal disambiguation using lambdas [duplicate]Qt连接函数-使用lambdas消除信号歧义[重复]
【发布时间】:2014-11-21 15:10:33
【问题描述】:

我使用的是 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 项目...

重载

您可能在示例中看到,连接到 QAbstractSocket::error 不是很漂亮,因为错误有一个超载,并且采取 重载函数的地址需要显式转换。

一些宏可能会有所帮助(使用 c++11 或 typeof 扩展)

最好的办法可能是建议不要使信号过载或 插槽……

...但是我们在过去的 Qt 小版本中一直在添加重载 因为获取函数的地址不是我们的用例 支持。但是现在如果不破坏源头,这将是不可能的 兼容性。

你知道这个宏到底是什么样子的吗?或者如何进行显式转换?

【问题讨论】:

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


    【解决方案1】:

    你必须显式地强制转换重载指针:

    void (QCompleter::* activatedOverloadPtr)(const QModelIndex&) = &QCompleter::activated;
    connect(fileSystemCompleter, activatedOverloadPtr, [&] (QModelIndex index)
    {
        fileSystemPathEdit->setFocus(Qt::PopupFocusReason);
    });
    

    【讨论】:

    • error C2440: 'initializing' : cannot convert from 'overloaded-function' to 'void (__cdecl QCompleter::* )(QModelIndex)' 2> 范围内具有此名称的函数均不匹配目标类型
    • 需要是 (const QModelIndex&) 才能完全匹配激活的签名。
    • 这会教我不看文档...
    • 感谢您的回答,这根本不是一种直观的语法。
    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多