疯狂的big昧事物

时间:2018-08-16 19:50:31

标签: c++ qt

今天,我发现了一件疯狂的事情。它可以在多个平台(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不允许我在此处发布代码,因此我要发布屏幕截图。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:4)

我认为问题是const参数中没有QSharedPointer<AbstractDownloadPersistentInfo>限定词。因此,在第一种情况下,共享指针需要进行额外的转换,而转换却变得模棱两可。

我想这将是一个简化的示例。 foo的模板构造函数使bar的两个变体都可行,因此即使从foo<char const *>构造foo<int>的实际尝试将导致模板实例化失败,也会产生歧义:

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