[C++] std::thread 使用重载函数

出错代码

#include <thread>
#include <iostream>
#include <utility>
#include <vector>
#include <string>

char readProcTask(const std::string &cmd, struct timespec &sample_time, std::vector<ProcInfo> &procs) {
    ...
}

char readProcTask(int32_t pid, struct timespec &sample_time, std::vector<ProcInfo> &procs) {
    ...
}

int main() {
    // sample for 500 ms
    struct timespec tm{};
    tm.tv_sec = 0;
    tm.tv_nsec = 1 * 500 * 1000 * 1000; /* 500 ms */

    std::vector<ProcInfo> procs;
    printf("Roboeye_server:\n");
    readProcTask("Roboeye_server", tm, procs);
    std::thread aa(readProcTask, "Roboeye_server", tm, procs);
}

报错信息

No matching constructor for initialization of 'std::thread' candidate template ignored:
couldn't infer template argument '_Callable' candidate constructor not viable: 
requires 1 argument, but 4 were provided candidate constructor not viable: 
requires 1 argument, but 4 were provided candidate constructor not viable: 
requires 1 argument, but 4 were provided candidate constructor not viable: 
requires single argument '__t', but 4 arguments were provided candidate constructor not viable: 
requires 0 arguments, but 4 were provided

解决办法

重载函数的函数签名(signature)不同,是不同的函数。当开发者想绑定一个重载函数而仅给出名字时,编译器无法判定希望绑定的是哪一个函数,就会抛出编译错误。
所以当有作为参数传递的重载函数时,需要声明使用哪个重载函数。

正确代码

#include <thread>
#include <iostream>
#include <utility>
#include <vector>
#include <string>

char readProcTask(const std::string &cmd, struct timespec &sample_time, std::vector<ProcInfo> &procs) {
    ...
}

char readProcTask(int32_t pid, struct timespec &sample_time, std::vector<ProcInfo> &procs) {
    ...
}

int main() {
    // sample for 500 ms
    struct timespec tm{};
    tm.tv_sec = 0;
    tm.tv_nsec = 1 * 500 * 1000 * 1000; /* 500 ms */

    std::vector<ProcInfo> procs;
    printf("Roboeye_server:\n");
    readProcTask("Roboeye_server", tm, procs);
    using f1 = char (*)(const std::string &, struct timespec &, std::vector<ProcInfo> &);
    std::thread aa(static_cast<f1>(readProcTask), "Roboeye_server", std::ref(tm), std::ref(procs));
}
posted @ 2023-01-10 11:55  空水  阅读(414)  评论(0编辑  收藏  举报