2011-09-15 37 views
5

Có thể ai đó vui lòng giải thích cho tôi tại sao trong đoạn mã sau tôi nhận được một cuộc gọi mơ hồ đến các nhà thầu bị quá tải trong Foo nếu tôi cố gắng khởi tạo MyFooC? Giả định của tôi là số nguyên được sử dụng như một tham số constructor sẽ được đẩy lên một int không dấu và đã được giải quyết nhưng điều này rõ ràng là không chính xác.Sự mơ hồ giữa các nhà xây dựng quá tải

template <typename t> class Foo 
{ 
private: 
    t m_Value; 
    unsigned int m_Length; 

public: 
    Foo(const t& Value) : 
     m_Value(Value), 
     m_Length(0) 
    { 
    } 

    Foo(unsigned int Length) : 
     m_Value(static_cast<t>(0)), 
     m_Length(Length) 
    { 
    } 
}; 

int main() 
{ 
Foo<double> MyFooA(32U); 
Foo<double> MyFooB(32.0f); 
//Foo<double> MyFooC(32); 
    return 0; 
} 

Trả lời

10

An int có thể được chuyển đổi thành cả số doubleunsigned; cả hai đều là được coi là chuyển đổi "mở rộng" và có xếp hạng bằng nhau. Theo quy tắc chung của , bất kỳ lúc nào bạn quá tải và một trong các tình trạng quá tải là loại không thể thiếu, cũng là một ý tưởng tốt để quá tải trên int, đảm bảo nhận được những gì bạn muốn và tránh sự mơ hồ. để chuyển một hằng số không thể thiếu.

BTW: mặc dù nó là rõ ràng trong bối cảnh những gì bạn có nghĩa là, trong tiêu chuẩn C++, "khuyến mãi" có một ý nghĩa rất chính xác, và không bao gồm một chuyển đổi của int để unsigned int.

0

Tôi cho rằng vấn đề là một int có thể dễ dàng được chuyển đổi thành gấp đôi. Tôi biết không có thông số kỹ thuật trong C + + mà ra lệnh cho một thứ tự ưu tiên cho đúc ngầm, do đó, khi trình biên dịch thấy một int có thể đi đến int kép hoặc unsigned, nó xem các cuộc gọi là mơ hồ.

+0

"Quảng cáo" được ưu tiên là "chuyển đổi", do đó, với một 'char', một hàm lấy' int' sẽ được ưu tiên là một tham số 'double'. Nhưng tiêu chuẩn C++ sử dụng định nghĩa rất hạn chế về "khuyến mãi"; về cơ bản, quảng cáo là một chuyển đổi sẽ diễn ra trong một toán tử nhị phân trong đó cả hai toán hạng đều có cùng loại. (Ví dụ, nếu bạn thêm hai 'short', cả hai được nâng lên' int' trước phần bổ sung.) –

+0

Ahh, tôi không biết điều đó, cảm ơn bạn. – Jodaka

Các vấn đề liên quan