爱新觉罗二狗 2025-01-24 14:07 采纳率: 40%
浏览 77
已结题

使用带参数线程出现错误 C2672 “std::invoke”: 未找到匹配的重载函数

使用带参数线程出现错误 C2672 “std::invoke”: 未找到匹配的重载函数

short Axis::MM_HY( const long nDelayTime, unsigned short &nHomeStatus )
{
    auto start = std::chrono::high_resolution_clock::now();

    std::thread thHomeState = std::thread( [this]( long nDelayTime, unsigned short &nHomeStatus ) {
        auto start = std::chrono::high_resolution_clock::now();
        do
        {
            short nRes = GetHomingStatus( m_nAxisIndex, &nHomeStatus );
            if( nRes != 0 )
            {
                return -1;
            }
            if( ( nHomeStatus == 3 ) || ( nHomeStatus == 1 ) )
            {
                return -1;
            }
            if( nHomeStatus == 5 )
            {
                return -1;
            }
            auto end = std::chrono::high_resolution_clock::now();
            if( std::chrono::duration_cast<std::chrono::milliseconds>( end - start ).count() > nDelayTime ) {
                return -1;
            }

        } while( true );
    }, nDelayTime, &nHomeStatus );
    thHomeState.detach();
}

上述代码出现如下错误

img

能否解释原因和如何修改,nHomeStatus 值是要传出的

  • 写回答

3条回答 默认 最新

  • GISer Liu 2025-01-24 15:33
    关注

    该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:

    问题分析

    在您的代码中,您尝试使用 std::thread 创建一个线程,并将 nDelayTimenHomeStatus 作为参数传递给线程函数。然而,编译器报错 C2672: “std::invoke”: 未找到匹配的重载函数,这表明 std::invoke 无法找到与您传递的参数匹配的函数签名。

    关键问题点:

    1. 参数传递方式nHomeStatus 是一个引用参数 (unsigned short &nHomeStatus),但在线程创建时,您传递的是 &nHomeStatus,即指针。这会导致类型不匹配。
    2. 线程函数的参数类型:线程函数的参数类型与传递的参数类型不匹配,导致 std::invoke 无法找到合适的重载函数。

    解决方案

    为了修复这个问题,您需要确保线程函数的参数类型与传递的参数类型一致。具体来说,您需要将 nHomeStatus 作为引用传递,而不是指针。

    修改步骤:

    1. 修改线程函数的参数类型:将 nHomeStatus 从指针改为引用。
    2. 确保线程函数的参数与传递的参数类型一致:在 std::thread 构造函数中,直接传递 nHomeStatus 作为引用。

    修改后的代码

    short Axis::MM_HY(const long nDelayTime, unsigned short &nHomeStatus)
    {
        auto start = std::chrono::high_resolution_clock::now();
    
        // 修改线程函数的参数类型为引用
        std::thread thHomeState = std::thread([this](long nDelayTime, unsigned short &nHomeStatus) {
            auto start = std::chrono::high_resolution_clock::now();
            do
            {
                short nRes = GetHomingStatus(m_nAxisIndex, &nHomeStatus);
                if (nRes != 0)
                {
                    return -1;
                }
                if ((nHomeStatus == 3) || (nHomeStatus == 1))
                {
                    return -1;
                }
                if (nHomeStatus == 5)
                {
                    return -1;
                }
                auto end = std::chrono::high_resolution_clock::now();
                if (std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() > nDelayTime) {
                    return -1;
                }
    
            } while (true);
        }, nDelayTime, std::ref(nHomeStatus));  // 使用 std::ref 传递引用
    
        thHomeState.detach();
    }
    

    解释

    1. std::ref 的使用std::ref 用于将 nHomeStatus 作为引用传递给线程函数。这样可以确保线程函数中的 nHomeStatus 是引用类型,而不是指针类型。
    2. 线程函数的参数类型:线程函数的参数类型与传递的参数类型一致,避免了类型不匹配的问题。

    总结

    通过上述修改,您可以将 nHomeStatus 作为引用传递给线程函数,从而解决 C2672 错误。确保线程函数的参数类型与传递的参数类型一致是解决此类问题的关键。

    希望这个解决方案对您有帮助!如果还有其他问题,欢迎继续提问。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月2日
  • 已采纳回答 1月25日
  • 创建了问题 1月24日