Hãy xem xét các loại sau đây:quá tải với typedef cho một lỗi
#include <iostream>
typedef unsigned long long usize_t;
typedef unsigned __int16 uword_t;
typedef uword_t clockval_t; // time without seconds in format HHMM
std::string toString(clockval_t nClock)
{
return std::to_string((usize_t)nClock/100) + ":" + std::to_string((usize_t)nClock % 100);
}
std::string toString(uword_t nValue)
{
return std::to_string((usize_t)nValue);
}
void test(void)
{
uword_t val = 1;
clockval_t time = 1023; // 10:23
std::cout << "Value: " << toString(val);
std::cout << "time: " << toString(time);
}
Bây giờ khi tôi cố gắng biên dịch này, tôi nhận được một lỗi từ trình biên dịch nói với tôi rằng std::string toString(clockval_t)
đã có một cơ thể. Tôi hiểu tại sao điều này xảy ra tất nhiên, bởi vì typedef chỉ là một bí danh cho uword_t
.
AFAIK các giải pháp chỉ là để cung cấp một phương pháp riêng biệt:
std::string toClockString(clockval_t);
hoặc làm cho nó một đối tượng:
class clockval ...
là đúng này hoặc là có một số cách khác để làm cho trình biên dịch chọn quá tải chính xác?
Ah, niềm vui của hệ thống loại C! – Sean
Vâng, IMO hơi yếu, bởi vì toàn bộ điểm của typedef là tạo các kiểu mới, do đó trình biên dịch có thể phân biệt chúng một cách chính xác để làm cho nó phù hợp. Tôi đoán có một số vấn đề tương thích ngược có liên quan mặc dù. – Devolus