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