Tôi hơi bối rối vì điều này. Cho phép giả sử tôi có một lớp helper Data
Toán tử T() không được sử dụng trong nhiệm vụ
class Data
{
public:
Data(const QVariant &value) : m_Variant(value) { }
operator QString() const { return m_Variant.toString(); }
private:
QVariant m_Variant;
};
sau đó khi tôi làm điều này:
Data d("text");
QString str = d; //str becomes "text"
nó hoạt động nhưng khi tôi tiếp tục làm:
Data d2("text2");
str = d2; //does not compile
nó vẫn thất bại phàn nàn:
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);
Nhưng thậm chí cung cấp
operator const char*() const;
không giúp ích gì. Thông báo về chuyển đổi chỉ biến mất và lỗi vẫn giữ nguyên. Có cách nào để giải quyết này khác vì thêm
QString &operator=(const Data &data);
để QString
hoặc gọi một cách rõ ràng
str = QString(d2);
?
Tôi đang bối rối bởi vì trình biên dịch suy luận rõ ràng một cách chính xác rằng toán hạng bên trái là một QString
và nó dường như đang cố gắng gọi chuyển đổi từ Data
những gì sẽ là một trong những QString
's operator=
s chấp nhận nhưng ngay cả khi chuyển đổi như vậy được định nghĩa nó Vẫn không làm việc.
CHỈNH SỬA: Sự cố có vẻ đến từ nhiều định nghĩa khác nhau của các thành viên operator T()
khác nhau. Trong trường hợp này là operator int()
.
bài tập "đúng" đầu tiên, không nên là 'QString str = d;' thay vì 'QString str = Data;'? – Gombat
'Dữ liệu' là gì? Bạn có thể cung cấp mã tối thiểu cho lớp này không? – Gombat
@Gombat Đã sửa lỗi đánh máy và cung cấp bộ xương Dữ liệu. Trong ứng dụng của tôi dữ liệu không phải là một QVariant nhưng thực sự là một giá trị rapidjson nhưng đối với các sự đơn giản, tôi đã sử dụng QVariant trong ví dụ. – Resurrection