Je suis un peu confus par cela. Laisse supposer que j'ai une classe d'aide Data
opérateur T() non utilisé dans l'affectation
class Data
{
public:
Data(const QVariant &value) : m_Variant(value) { }
operator QString() const { return m_Variant.toString(); }
private:
QVariant m_Variant;
};
quand je fais ceci:
Data d("text");
QString str = d; //str becomes "text"
cela fonctionne mais quand je continue à faire:
Data d2("text2");
str = d2; //does not compile
il ne parvient se plaindre:
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);
Mais même en fournissant
operator const char*() const;
ne aide pas. Le message sur la conversion disparaît et l'erreur reste la même. Y at-il un moyen de résoudre cette autre que d'ajouter
QString &operator=(const Data &data);
à QString
ou d'appeler explicitement
str = QString(d2);
?
Je suis confus parce que le compilateur clairement déduit à juste titre que l'opérande gauche est un QString
et il essaie d'appeler apparemment la conversion de Data
à ce qui l'un des operator=
s de » la QString
accepter, mais même si une telle conversion est définie, il ne fonctionne toujours pas.
EDIT: Le problème semble provenir de plusieurs définitions des différents membres operator T()
. Dans ce cas operator int()
.
la première affectation "correcte", ne devrait-elle pas être "QString str = d;" au lieu de "QString str = Data;"? – Gombat
Qu'est-ce que 'Data'? Pourriez-vous fournir un code minimal pour cette classe? – Gombat
@Gombat Correction de la faute de frappe et du squelette de données fourni. Dans mon application, les données ne sont pas un QVariant mais en réalité une valeur de rapidjson mais pour des raisons de simplicité j'ai utilisé QVariant dans l'exemple. – Resurrection