【问题标题】:Crazy ambiguous thing疯狂暧昧的事
【发布时间】:2019-01-23 20:18:56
【问题描述】:

今天我发现了一件疯狂的事情。它可以在多个平台(Windows、macOS、Android)下重现。

我使用 Qt,并且有以下“有问题的”类:

class AbstractUiDownloadInfo :
        public QObject
{
    Q_OBJECT

public:
    explicit AbstractUiDownloadInfo(
            const QSharedPointer<const AbstractDownloadPersistentInfo> &info,
            const QSharedPointer<const AbstractDownloadRunTimeInfo> &info2,
            QObject *parent = nullptr);
    explicit AbstractUiDownloadInfo(
            const QSharedPointer<const AbstractDownloadPersistentInfo> &info,
            QObject *parent = nullptr);
    explicit AbstractUiDownloadInfo(
            const QSharedPointer<const AbstractDownloadRunTimeInfo> &info2,
            QObject *parent = nullptr);

我也有这个结构:

struct AbstractNewDownloadRequest
{
    QVector<QSharedPointer<AbstractDownloadPersistentInfo>> infos;
};

所以,我正在尝试使用它:

// somewhere before
AbstractNewDownloadRequest m_request;
// then:
auto info = m_request.infos[index];
return new AbstractUiDownloadInfo(info);

给我以下错误:

..\..\fdm-qml\common\abstractui\abstractuinewdownloadrequest.cpp(30): error C2668: 'AbstractUiDownloadInfo::AbstractUiDownloadInfo': ambiguous call to overloaded function
c:\work\source\fdm-qml\common\abstractui\abstractuidownloadinfo.h(42): note: could be 'AbstractUiDownloadInfo::AbstractUiDownloadInfo(const AbstractUiDownloadInfo &)'
c:\work\source\fdm-qml\common\abstractui\abstractuidownloadinfo.h(24): note: or       'AbstractUiDownloadInfo::AbstractUiDownloadInfo(const QSharedPointer<const AbstractDownloadRunTimeInfo> &,QObject *)'
c:\work\source\fdm-qml\common\abstractui\abstractuidownloadinfo.h(21): note: or       'AbstractUiDownloadInfo::AbstractUiDownloadInfo(const QSharedPointer<const AbstractDownloadPersistentInfo> &,QObject *)'
..\..\fdm-qml\common\abstractui\abstractuinewdownloadrequest.cpp(30): note: while trying to match the argument list '(QSharedPointer<AbstractDownloadPersistentInfo>)'

但是下面的代码可以正常工作:

QSharedPointer<const AbstractDownloadPersistentInfo> info =
            m_request.infos[index];
return new AbstractUiDownloadInfo(info);

发生了什么事?

添加 #1。

StackOverflow 不允许我再在这里发布代码,所以我发布屏幕截图。

【问题讨论】:

  • 嗯......我认为模棱两可!=不知道......
  • 它怎么能为我的参数类型调用 AbstractUiDownloadInfo::AbstractUiDownloadInfo(const AbstractUiDownloadInfo &) 构造函数??
  • “StackOverflow 不允许我再在这里发布代码” - 现在这很不寻常……如果您将代码作为文本发布会发生什么?
  • @VTT 他可能打了这个:meta.stackoverflow.com/questions/310791/…
  • 这个问题真的需要一个更清晰的标题。

标签: c++ qt


【解决方案1】:

我认为问题在于QSharedPointer&lt;AbstractDownloadPersistentInfo&gt;argument 中缺少const 限定符。所以在第一种情况下,共享指针需要经过额外的转换,这会变得模棱两可。

我想这将是一个简化的示例。 foo 的模板构造函数使 bar 的两种变体都成为可行的重载,因此即使实际尝试从 foo&lt;int&gt; 构造 foo&lt;char const *&gt; 将导致模板实例化失败,也会出现歧义:

template<typename T> struct
foo
{ 
    T m_v;

    foo(void) {}

    foo(foo<T> const &) {}

    template<typename X>
    foo(foo<X> const &): m_v{X{}} {}
};

void bar(foo<int const>) {}

void bar(foo<char const *>) {}

int main()
{
    foo<int> f;
    bar(f);
}

online compiler

【讨论】:

  • 是的,但无论如何,它怎么会模棱两可??
  • 除了只能接受 1 个参数的构造函数之外,它可以调用什么构造函数: const QSharedPointer &info ???
  • @AlexanderDyagilev 我们必须看看AbstractDownloadPersistentInfoAbstractDownloadRunTimeInfo 是如何定义的。
  • 这些是完全不同且独立的结构。他们彼此不了解。
  • @AlexanderDyagilev 他们都源自QObject我相信?
猜你喜欢
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多