EDIT: Theo nhận xét của Mike Seymour, tôi đã thay thế operator std::string() const;
bằng operator char *() const;
và thay đổi việc triển khai tương ứng. Điều này cho phép đúc ngầm, nhưng, vì lý do nào đó, toán tử int dài chưa ký được ưu tiên hơn toán tử char *, điều này không cảm thấy đúng ... Ngoài ra, tôi không muốn để lộ những thứ C khó chịu như char * bên ngoài lớp, khi tôi có std :: string. Tôi có một linh cảm mà lớp CustomizedInt của tôi cần phải kế thừa từ một số thứ để hỗ trợ tính năng mà tôi mong muốn. Ai có thể vui lòng xây dựng bình luận của Mike về std::basic_string
? Tôi không chắc tôi hiểu nó đúng cách.C++ Nhà điều hành chuyển đổi ngầm định Ưu tiên
Tôi có đoạn mã này:
#include <string>
#include <sstream>
#include <iostream>
class CustomizedInt
{
private:
int data;
public:
CustomizedInt() : data(123)
{
}
operator unsigned long int() const;
operator std::string() const;
};
CustomizedInt::operator unsigned long int() const
{
std::cout << "Called operator unsigned long int; ";
unsigned long int output;
output = (unsigned long int)data;
return output;
}
CustomizedInt::operator std::string() const
{
std::cout << "Called operator std::string; ";
std::stringstream ss;
ss << this->data;
return ss.str();
}
int main()
{
CustomizedInt x;
std::cout << x << std::endl;
return 0;
}
nào in "nhà điều hành gọi là unsigned long int; 123". Câu hỏi của tôi là:
- Sau khi tôi xóa toán tử unsigned long int, tại sao tôi cần truyền x thành std :: string một cách rõ ràng? Tại sao nó không gọi toán tử ngầm ẩn (std :: string) trực tiếp?
- Có bất kỳ tài liệu nào giải thích những phôi ngầm tiềm ẩn nào được phép không và đó là thứ tự ưu tiên của chúng? Có vẻ như nếu tôi thêm toán tử unsigned int vào lớp này cùng với toán tử unsigned long int, tôi nhận được lỗi biên dịch về sự mơ hồ cho nhà điều hành < < ...
- Ngoài ra, tôi biết rằng việc định nghĩa toán tử như vậy có thể thực hành kém, nhưng tôi không chắc rằng tôi hoàn toàn hiểu được những cảnh báo liên quan. Ai đó có thể phác thảo chúng? Nó sẽ được thực hành tốt hơn để chỉ xác định phương pháp công khai ToUnsignedLongInt và ToString?
Điều này liên quan: [Sự cố phân giải quá tải khi truyền trực tuyến đối tượng qua chuyển đổi ẩn thành chuỗi] (http://stackoverflow.com/questions/6677072/overload-resolution-failure-when-streaming-object-via-implicit-conversion -to-str) –
@Als: Hãy lấy nó từ từ ... Tôi chưa chuẩn bị để đi sâu vào các mẫu chưa :) –