2012-09-10 37 views
3
std::vector<int> v1; 
std::function<void(const int&)> funct = 
static_cast<std::function<void(const int&)>>(std::bind(
              &std::vector<int>::push_back, 
              &v1, 
              std::placeholders::_1)); 

這給我no matching function for call to bindstd :: bind未按預期工作

我能夠做到這一點,雖然:

threadPool.push_back(std::thread(runThread<lazyFunct>, 
        std::bind(&LazySkipList<int>::add, 
        &lsl, std::placeholders::_1), 0, 1000000, 1000000)); 

我使用的Xcode 4.4 LLVM C++ 11的支持。

+3

你可能會更好過更換'的std ::功能<無效(const int的&)>本功能= 的static_cast <使用'auto funct = std :: bind(...)'調用std :: function >(std :: bind(...))'。更可讀的imo。 – chris

+0

自動本功能=標準::綁定(&的std ::矢量 ::的push_back,&V1,性病::佔位符:: _ 1);給我同樣的錯誤...我接受可讀性方面... –

+0

是的,C++ 11中的所有'auto'都是基於初始化的類型推斷出的類型。 'auto var = 5;'將產生'var'作爲'int'。有些特定的情況,例如'std :: bind'和迭代器聲明,這些功能在我的書中非常有用。 – chris

回答

6

問題是std::vector::push_back()超載與兩個可能的類型簽名:

void push_back(const T& value); 
void push_back(T&& value); 

這樣,模板參數std::bind()無法推斷。但是,您可以明確聲明模板參數:

std::bind<void(std::vector<int>::*)(const int&)>(&std::vector<int>::push_back, &v1, std::placeholders::_1); 

此解決方法正確。

當然,在這一點上它可能是簡單的只是使用lambda:

auto func = [&](int i){ v1.push_back(i); }; 
+2

對於lambda建議+1,在這種情況下更好。 – Yuushi

1

嘗試:

auto funct = std::bind(static_cast<void(std::vector<int>::*)(const int&)> 
              (&std::vector<int>::push_back), 
               &v1, 
               std::placeholders::_1); 

push_back超載,所以你需要將它轉換爲正確的過載。

或者:

void(std::vector<int>::*p)(const int&) = &std::vector<int>::push_back; 
auto funct = std::bind(p, &v1, std::placeholders::_1); 

或顯式提供模板參數,如圖基思·巴拉德的答案,這可能是真正的最佳。

+0

謝謝...按照預期工作你... http://stackoverflow.com/questions/2333122/boostbind-stdsetcount-compile-error只是爲了更清楚上面的鏈接沒有提到需要施放...我預計不會再工作,從而增加了投綁定而不是功能它的自我......找不到,但有見招工作...謝謝... –

+0

@VishalKumar:是的,在你的鏈接問題的答案是錯的。 –