C++将参数作为引用传递给线程无法工作。

3

我写了一段代码,它创建了一个线程并将参数作为引用发送给该线程,但是在函数名下面出现了红色的下划线,就好像我不能调用它一样。有人知道我的代码出了什么问题吗?

我的代码:

#include "getPrimes.h"

void getPrimes(const int& begin, const int& end, std::vector<int>& primes)
{
    int i = 0, j = 0;
    for (i = begin; i <= end; i++)
    {
        if (i > 1)
        {
            for (j = 2; j <= i / 2; j++) 
            {
                if (i % j != 0) 
                {
                    primes.push_back(i);
                }
            }
        }
    }
}

std::vector<int> getPrimes(const int& begin, const int& end)
{
    std::vector<int> vector;
    std::thread thread(getPrimes, std::ref(begin), std::ref(end), std::ref(vector)); // I get the red underline here
}

我收到的错误

在此输入图片描述


2
与您的问题无关,但实际上没有理由通过“const”引用传递“int”值;只需按值接受它们即可。原始类型,尤其是“int”,通常适合寄存器--而不是强制间接引用并且可能由于别名问题难以优化的引用。 - Human-Compiler
1个回答

4

由于getPrimes被重载了,您需要帮助编译器进行重载分辨。

示例:

std::vector<int> getPrimes(const int& begin, const int& end) {
    std::vector<int> vector;
    std::thread thread(      // see static_cast below:
        static_cast<void(*)(const int&, const int&, std::vector<int>&)>(getPrimes),
        std::cref(begin), std::cref(end), std::ref(vector));
    // ...
    thread.join();
    return vector;
}

一个简单的例子:
void foo(int) {}
void foo(int, int) {}

int main() {
    // auto fp = foo; // same problem - which foo should fp point at?

    // same solution:
    auto fp = static_cast<void(*)(int)>(foo);
}

1
是的。"没有实例与参数列表匹配"的错误听起来像是"你不能传递那个参数类型",但通常它只意味着"我不确定你想调用哪个函数"。 - Kyle A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接