c++错误C2893:特化函数模板失败

c++ error C2893: Failed to specialize function template

本文关键字:函数模板 失败 错误 C2893 c++      更新时间:2023-10-16

我试图运行这个,但我一直收到一个错误。

#include <iostream>
#include <thread>
using namespace std;
void primeNumbers( int num, int prime )
{
    cout << "The prime numbers equal to or below " << num << " are: " << endl;
    for ( int i = 1; i <= num; i++ )
    {
        prime = 0;
        for( int j = 2;j <= i/2; j++ )
        {
            if( i % j ==0 )
            {
                prime++;
                break;
            }
        }
        if ( prime == 0 && i != 1 )
        cout << i << endl;
    }
}
int main()
{
    int num;
    int prime = 0;

    cout << "Enter a positive integer: ";
    cin >> num;
    std::thread primeN( primeNumbers );
    primeN.join( );
    system("pause");
    return 0;
}

我已经从输出窗口复制了所有内容。

1>c:program files (x86)microsoft visual studio 14.0vcincludethrxthread(238): error C2893: Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'
1>  c:program files (x86)microsoft visual studio 14.0vcincludethrxthread(238): note: With the following template arguments:
1>  c:program files (x86)microsoft visual studio 14.0vcincludethrxthread(238): note: '_Callable=void (__cdecl *)(int,int)'
1>  c:program files (x86)microsoft visual studio 14.0vcincludethrxthread(238): note: '_Types={}'
1>  c:program files (x86)microsoft visual studio 14.0vcincludethrxthread(247): note: see reference to function template instantiation 'void std::_LaunchPad<_Target>::_Execute<0>(std::tuple<void (__cdecl *)(int,int)> &,std::integer_sequence<_Ty,0>)' being compiled
1>          with
1>          [
1>              _Target=std::unique_ptr<std::tuple<void (__cdecl *)(int,int)>,std::default_delete<std::tuple<void (__cdecl *)(int,int)>>>,
1>              _Ty=size_t
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludethrxthread(247): note: see reference to function template instantiation 'void std::_LaunchPad<_Target>::_Execute<0>(std::tuple<void (__cdecl *)(int,int)> &,std::integer_sequence<_Ty,0>)' being compiled
1>          with
1>          [
1>              _Target=std::unique_ptr<std::tuple<void (__cdecl *)(int,int)>,std::default_delete<std::tuple<void (__cdecl *)(int,int)>>>,
1>              _Ty=size_t
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludethrxthread(242): note: while compiling class template member function 'void std::_LaunchPad<_Target>::_Run(std::_LaunchPad<_Target> *) noexcept'
1>          with
1>          [
1>              _Target=std::unique_ptr<std::tuple<void (__cdecl *)(int,int)>,std::default_delete<std::tuple<void (__cdecl *)(int,int)>>>
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludethrxthread(230): note: see reference to function template instantiation 'void std::_LaunchPad<_Target>::_Run(std::_LaunchPad<_Target> *) noexcept' being compiled
1>          with
1>          [
1>              _Target=std::unique_ptr<std::tuple<void (__cdecl *)(int,int)>,std::default_delete<std::tuple<void (__cdecl *)(int,int)>>>
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludethrxthread(256): note: see reference to class template instantiation 'std::_LaunchPad<_Target>' being compiled
1>          with
1>          [
1>              _Target=std::unique_ptr<std::tuple<void (__cdecl *)(int,int)>,std::default_delete<std::tuple<void (__cdecl *)(int,int)>>>
1>          ]
1>  c:program files (x86)microsoft visual studio 14.0vcincludethread(52): note: see reference to function template instantiation 'void std::_Launch<std::unique_ptr<std::tuple<void (__cdecl *)(int,int)>,std::default_delete<std::tuple<void (__cdecl *)(int,int)>>>>(_Thrd_t *,_Target &&)' being compiled
1>          with
1>          [
1>              _Target=std::unique_ptr<std::tuple<void (__cdecl *)(int,int)>,std::default_delete<std::tuple<void (__cdecl *)(int,int)>>>
1>          ]
1>  c:usersandredocumentsschoolcsciprimeprimetestprime.cpp(34): note: see reference to function template instantiation 'std::thread::thread<void(__cdecl &)(int,int),,void>(_Fn)' being compiled
1>          with
1>          [
1>              _Fn=void (__cdecl &)(int,int)
1>          ]

我不太了解多线程,因为我昨天才开始学习它。所以,如果我做错了什么,请告诉我。

必须为可调用对象提供参数

的例子:

std::thread primeN( primeNumbers,42, 0 );

如果你想更新你的prime,使用:

std::thread primeN( primeNumbers,42, std::ref(prime) );

看到