2011-08-21 27 views
5

Theo trình biên dịch gcc-4.6, lệnh gọi hàm func trong ví dụ dưới đây là mơ hồ.Gọi mơ hồ (chuyển đổi từ char * sang lambda vs std :: string)

void func(const std::string &str) { 
} 

void func(std::function<std::string()> f) { 
} 

void test() { 
    func("Hello"); 
} 

Trình biên dịch có đúng khi nói điều này không? Nếu tôi loại bỏ quá tải đầu tiên mã này sẽ không biên dịch vì nó sẽ không khởi tạo các mẫu liên quan.

Có cách nào để giải quyết vấn đề này bên cạnh đổi tên một trong hai hàm hoặc bằng cách chuyển đổi thành chuỗi std :: rõ ràng không?

Trả lời

3

Bạn cũng có thể thêm một tình trạng quá tải thứ ba để nắm bắt rõ ràng chuỗi trường hợp chữ:

void func(char const* cstr) { 
    return func(std::string(cstr)); 
} 
4

Nó có thể được giải quyết bằng cách SFINAE trong constructor của std::function. Tuy nhiên, nó dường như không được yêu cầu và không được GCC cung cấp. Vì vậy, bạn không thể phụ thuộc vào việc nó hoạt động.

+0

Điều đó có vẻ vô lý! –

+1

@Tomalak: Đúng vậy. – Puppy

+0

Tôi thậm chí không chắc liệu việc triển khai có được phép thực hiện điều này hay không. Tôi sẽ rất vui nếu có ai đó có thể tìm thấy một tài liệu tham khảo cụ thể hoặc giải thích thêm. –

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