我对此有点困惑。假设我有一个助手类Data
class Data
{
public:
Data(const QVariant &value) : m_Variant(value) { }
operator QString() const { return m_Variant.toString(); }
private:
QVariant m_Variant;
};
然后当我这样做时:
Data d("text");
QString str = d; //str becomes "text"
它有效,但当我继续这样做时:
Data d2("text2");
str = d2; //does not compile
它没有抱怨:
ambiguous overload for 'operator=' (operand types are 'QString' and 'Data')
candidates are:
...
QString &operator=(const QString &);
QString &operator=(QString &&);
QString &operator=(const char*); <near match>
no known conversion from Data to const char*
QString &operator=(char);
但即使提供
operator const char*() const;
没有帮助。关于转换的消息消失了,错误保持不变。除了添加之外有没有办法解决这个问题
QString &operator=(const Data &data);
到QString
或显式调用
str = QString(d2);
?
我很困惑,因为编译器清楚地正确推断出左操作数是 aQString
并且它显然试图将转换从sData
之一调用,但即使定义了这样的转换它仍然不起作用。QString
operator=
编辑:
问题似乎来自不同operator T()
成员的多个定义。在这种情况下operator int()
。