2012-02-09 11 views
5

Tôi đang cố tạo một vectơ std :: functions trong lớp logger của tôi. Khi tôi cố gắng để ràng buộc một phương pháp để std :: tôi chức năng như thế:sử dụng liên kết std trong c + + cho các hàm có đối số (chuỗi)

NcursesWindow log_win("Logs",LINES-1,COLS/3,0,COLS*2/3); 
std::function<void(std::string)> f = std::bind(&NcursesWindow::add_string,&log_win); 

chức năng add_string được xác định như sau:

void add_string(string text); 

Tuy nhiên, gcc (với các addon gfilt để cố gắng hiểu được lỗi mẫu) trả về:

BD Software STL Message Decryptor v3.10 for gcc 2/3/4 
In file included from ./inc/ncursesui.h:6:0, 
from src/ncursesui.cpp:1: 
functional: In static member function ‘static void _Function_handler< 
    void({basic_string<char>} ...), _Bind< 
     _Mem_fn<void (NcursesWindow::*)(basic_string<char>)>(
      NcursesWindow)> 
>::_M_invoke(const _Any_data &, {basic_string<char>} ...)’: 
[STL Decryptor: Suppressed 1 more STL standard header message] 
src/ncursesui.cpp:32:86: instantiated from here 
functional:1778:2: erreur: no match for call to ‘(
    _Bind< 
     _Mem_fn<void (NcursesWindow::*)(basic_string<char>)>(
      NcursesWindow)>) (basic_string<char>)’ 

STL Decryptor reminders: 
Use the /hdr:L option to see all suppressed standard lib headers 
Use the /cand:L option to see all suppressed template candidates 
+0

Có phải 'add_string()' là một hàm thành viên của 'NcursesWindows' không? – liwp

+1

Không có trình giữ chỗ cho tham số chuỗi bị thiếu trong lệnh gọi liên kết của bạn? Trong tăng bạn sẽ cần 'bind (& NcursesWindow :: add_string, & log_win, _1)' – nabulke

+0

có, nguyên mẫu hàm này được lấy từ NcursesWindows .h – Tuxer

Trả lời

9

Không có trình giữ chỗ cho thông số string bị thiếu trong lệnh gọi liên kết?

Hãy thử điều này:

bind(&NcursesWindow::add_string,&log_win,std::placeholders::_1); 

Chức năng thành viên có hai tham số: ẩn this con trỏ và một std::string. Bạn ràng buộc cái đầu tiên với cá thể của lớp của bạn, và cái còn lại sẽ ở lại, do đó trình giữ chỗ.