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 bind

私はこれを行うことができます:

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

llvm C++11をサポートするXcode4.4を使用しています。

4

2 に答える 2

7

問題はstd::vector::push_back()、2つの可能な型シグネチャで過負荷になっています。

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);

これは正しく解決されます。

もちろん、この時点では、ラムダを使用する方が簡単かもしれません。

auto func = [&](int i){ v1.push_back(i); };
于 2012-09-10T01:52:27.933 に答える
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);

または、Keith Ballardの回答に示されているように、実際に最適なテンプレート引数を明示的に指定します。

于 2012-09-10T01:52:18.130 に答える