2012-04-11 38 views
8

Tôi có một chức năng quá tải mà tôi muốn chuyển dọc theo gói trong một hàm std ::. GCC4.6 không tìm thấy "hàm trùng khớp". Trong khi tôi đã tìm thấy một số câu hỏi ở đây các câu trả lời không rõ ràng như tôi muốn chúng. Ai đó có thể cho tôi biết lý do tại sao các mã sau đây không thể khấu trừ quá tải chính xác và làm thế nào để (thanh lịch) làm việc xung quanh nó?Chức năng nạp chồng quá tải thông qua std :: function

int test(const std::string&) { 
    return 0; 
} 

int test(const std::string*) { 
    return 0; 
} 

int main() { 
    std::function<int(const std::string&)> func = test; 
    return func(); 
} 

Trả lời

17

Đó là tình huống mơ hồ.

Để disambiguate nó, sử dụng dàn diễn viên rõ ràng như:

typedef int (*funtype)(const std::string&); 

std::function<int(const std::string&)> func=static_cast<funtype>(test);//cast! 

Bây giờ trình biên dịch sẽ có thể disambiguate tình hình, dựa trên loại trong dàn diễn viên.

Hoặc, bạn có thể làm điều này:

typedef int (*funtype)(const std::string&); 

funtype fun = test; //no cast required now! 
std::function<int(const std::string&)> func = fun; //no cast! 

Vậy tại sao std::function<int(const std::string&)> không làm việc theo cách funtype fun = test làm việc trên?

Câu trả lời là, vì std::function có thể được khởi tạo với bất kỳ đối tượng nào, vì hàm tạo của nó được templatized độc lập với đối số mẫu bạn đã chuyển đến std::function.

+1

Vui lòng sử dụng 'static_cast' thay cho dàn diễn viên cũ. – Anonymous

+0

@Anonymous: Có. Nhưng tôi muốn làm cho nó ngắn. Dù sao, tôi đã chỉnh sửa nó để làm cho nó trông giống như C++ - ish! – Nawaz

+0

Làm thế nào mỉa mai - bạn phải sử dụng con trỏ hàm để có được một hàm :: std, được giới thiệu để thoát khỏi con trỏ hàm :) thx – abergmeier