使用 boost::bind 的调用错误没有匹配的函数

Posted

技术标签:

【中文标题】使用 boost::bind 的调用错误没有匹配的函数【英文标题】:No matching function for call Error using boost::bind 【发布时间】:2014-05-07 05:01:10 【问题描述】:

我正在尝试编写一个并行冒泡排序函数。我在使用 boost::bind: 时遇到错误:

void swap(vector<int>& input, int i, int j)

    if (input[i] > input[j])
       
        int temp = input[j];
        input[j] = input[i];
        input[i] = temp;
       
    return;


void parallel_bubblesort(vector<int>& input, int, int)


    int i, j, temp;

    for (i = 0; i < input.size(); i++)
       
        boost::asio::io_service ioservice;
        boost::thread_group threadpool;
        for (j = 0; j < input.size() - 1; j++)
           
            ioService.post(boost::bind(&swap, boost::ref(input), 2 * j + i % 2, 2 * j + 1 + i % 2));
           

        for (int t = 0; t < NUM_THREADS; t++)
           
            threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService));
           

        threadpool.join_all();
        ioService.stop();
       
    return;

挂断了

ioService.post(boost::bind(&swap, boost::ref(input), 2 * j + i % 2, 2 * j + 1 + i % 2));

错误提示

no matching function for call to ‘bind(<unresolved overloaded function type>, std::vector<int, std::allocator<int> >&, int, int)’

这看起来很奇怪,因为这些都没有重载,有人知道这是什么意思吗?

编辑:这是完整的程序

#include <iostream>
#include <chrono>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <algorithm>
#include <boost/thread.hpp>
#include <boost/asio/io_service.hpp>
#define NUM_THREADS 4

using namespace std;
using namespace boost;
using namespace boost::this_thread;

int check_solution(const vector<int>&);
void bubblesort(vector<int>&);
void swap1(vector<int>&, int, int);
void parallel_bubblesort(vector<int>&);

int main()

    string line, token;
    string file = "test.txt";
    vector<int> unsorted_integers;

    //print out filename
    cout << file << endl;

    ifstream myfile(file);

    //open file
    if(myfile.is_open())
       
        //load everything into a vector
        while (getline(myfile, line))
           
            int temp;
            std::istringstream ss(line);
            std::getline(ss, token, '\n');
            temp = atoi(token.c_str());
            unsorted_integers.push_back(temp);
           
       

    vector<int> unsorted_integers2(unsorted_integers);
 //starts clock
    std::chrono::high_resolution_clock::time_point start2 = std::chrono::high_resolution_clock::now();

    //run the sort function and check for correctness
    parallel_bubblesort(unsorted_integers2);
    if(check_solution(unsorted_integers2))
    
        cout << "The parallel sort solution is correct" << endl;
    
    else
    
        cout << "The parallel sort solution is incorrect" << endl;
    

    //stops clock and prints times
    std::chrono::high_resolution_clock::time_point end2 = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> total_time2 = std::chrono::duration_cast<std::chrono::duration<double>>(end2 - start2);
    cout << "The parallel sort function took " << total_time2.count() << " seconds." << endl;

    return 0;



void swap1(vector<int>& input, int i, int j)

    if (input[i] > input[j])
    
        int temp = input[j];
        input[j] = input[i];
        input[i] = temp;
    
    return;


void parallel_bubblesort(vector<int>& input, int, int)


    int i, j;

    for (i = 0; i < input.size(); i++)
      
        boost::asio::io_service ioService;
        boost::thread_group threadpool;
        for (j = 0; j < input.size() - 1; j++)
        
            ioService.post(boost::bind(&swap1, boost::ref(input), 2 * j + i % 2, 2 * j + 1 + i % 2));
        

        for (int t = 0; t < NUM_THREADS; t++)
        
            threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService));
        

        threadpool.join_all();
        ioService.stop();
    
    return;


int check_solution(const vector<int>& solution)

    vector<int> correct_solution(solution);
    std::sort(correct_solution.begin(), correct_solution.end());
    return (solution == correct_solution);

【问题讨论】:

您使用的是什么编译器和 boost 版本?带有 Boost 1.55 的 VC12 编译它没有问题。您也可能缺少include,如果您提供了一个准备好尝试使用您的includes 的sn-p 可能会有所帮助。 我正在使用命令 g++ bubblesort.cpp -std = c++0x -boost_thread-mt -lboost_system 将 -Wall -Werror 添加到您的编译行。 哦,很酷的技巧,这似乎很有希望这是输出:bubblesort.cpp: In function 'void bubblesort(std::vector >&)': bubblesort .cpp:94:错误:有符号和无符号整数表达式之间的比较bubblesort.cpp:96:错误:有符号和无符号整数表达式之间的比较bubblesort.cpp:92:错误:未使用的变量'temp'bubblesort.cpp:在函数'void parallel_bubblesort(std::vector >&, int, int)': bubblesort.cpp:120: error: 有符号和无符号整数表达式之间的比较 实际上,是的,这些警告似乎与问题无关 【参考方案1】:

您可能在某处做using namespace std;,而std::swap 是一回事。我建议您只需将 swap 函数重命名为其他名称。

【讨论】:

感谢您的建议,但更改并没有解决问题 其实这的问题。尝试将函数 swap() 重命名为其他名称。 我刚刚删除了using namespace std; 并明确引用了std::vectors 并且错误消失了。 我重命名了 swap 并没有帮助 好吧,我们现在可能在不同的页面上使用代码。你能从你当前的代码中创建一个最小的 sn-p 来显示错误吗?

以上是关于使用 boost::bind 的调用错误没有匹配的函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost::bind 有啥好处?

使用 boost::bind 将成员函数绑定到 boost::bisect?

使用boost bind时无效使用非静态成员函数 - c ++

boost--bind

更自然的 boost::bind 替代方案?

boost::bind 返回一个函数对象,它是需要指针的函数的参数