2015-05-02 43 views
5

Đây là một số câu liên của tôi:Tại sao chức năng không đúng định dạng được sử dụng thay vì chuyển đổi ngầm?

class Base{}; 

class Derived : private Base{}; 

template<class T> 
class Wrapper 
{ 
    public: 
     template<typename T2> 
     Wrapper(T2&&) 
     { } 
}; 

// Function declarations 
void func(Base& param); 
void func(Wrapper<Derived>); 
void funcUnambiguous(Wrapper<Derived>); 


// Here is the Call: 
Derived d = Derived(); 
func(d);    // <- Error 

GCC 4.9 mang lại cho tôi: error: 'Base' is an inaccessible base of 'Derived'

Trong khi tôi làm

Derived d = Derived(); 

funcUnambiguous(d); 

nó chỉ hoạt động tốt.

Có vẻ như, bất kỳ chức năng nào chỉ yêu cầu dàn diễn viên giá rẻ, ngay cả khi không đúng định dạng, ẩn các hàm ẩn, nhưng tốn kém. Có ai có đầu mối không?

Trả lời

5

Đã cập nhật, nhờ @ T.C.

Wrapper 's ctor là một mẫungười dùng xác định chuyển đổi, vì thế mà phi mẫuchuyển đổi tiêu chuẩn chuỗi quá tải với Base& được ưu tiên. Kiểm tra truy cập chỉ được thực hiện sau khi chọn quá tải - quá trễ trong trường hợp của bạn.

Quy tắc hoàn chỉnh phức tạp, có thể tìm thấy thêm here, xem phần "Chức năng khả thi tốt nhất".

+0

Thậm chí nếu không đúng định dạng ?! Điều đó không thực sự làm cho sence, đặc biệt là trong trường hợp này, nơi mà các lớp cơ sở được rõ ràng là "tư nhân". –

+0

Tôi hiểu, nhưng đây không phải là lỗi trong tiêu chuẩn? Không có chuyển đổi ngầm, thậm chí không rõ ràng. Dù sao cũng cảm ơn bạn! –

+0

@JakobRiedle Độ phân giải quá tải là một trong những phần phức tạp nhất của C++ (IMHO). Tôi thậm chí sẽ không dám nghĩ rằng tôi biết tất cả các quy tắc trong mọi trường hợp, rằng tôi biết những gì sẽ là "đúng" hoặc thậm chí "tốt hơn" hoặc làm thế nào nó phát triển theo thời gian. :) Tôi đoán chúng ta sẽ phải chấp nhận nó như nó được. –

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