【问题标题】:Error: 'Failed to specialize function template' C2893 'std::invoke'错误:“无法专门化函数模板”C2893“std::invoke”
【发布时间】:2016-09-16 17:11:54
【问题描述】:

我正在 Visual Studio 2013 中编写 MFC 程序,但我不断收到以下两个错误

Error C2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'

Error C2672 'std::invoke': no matching overloaded function found

错误与文件 xthread 第 238 行有关

我是 c++/MFC 的新手,我正在尝试编写一个将在后台运行到系统时间的函数。

这是我正在使用的代码:

void task1(ExperimentTab& dlg)
{
    while (true)
    {
        CString showtime = CTime::GetCurrentTime().Format("%H:%M:%S");
        int x = dlg.m_showTime.GetWindowTextLengthA();
        dlg.m_showTime.SetWindowTextA(_T(""));
        dlg.m_showTime.ReplaceSel(showtime, 0);
    }
}

void mainThread()
{
    std::thread t1(task1);
    t1.join();
}

然后在按下按钮时调用它来开始时间,但同样的按钮也用于停止时间。

【问题讨论】:

  • 在这里从多线程中获益甚少。请改用计时器(请参阅CWnd::SetTimer),并将所有内容保存在单个线程上。额外的好处:您不会烧毁整个 CPU 内核,只是为了更新当前时间。而且您实际上可以关闭您的进程,而无需进入任务管理器。

标签: c++ visual-studio-2013 mfc


【解决方案1】:

函数task1 接受单个参数(用作线程主体),但您在t1 构造函数中不传递任何参数。 编译器无法创建 std::invoke 调用 task1 函数而没有方法参数。

要修复它,请像这样调用构造函数:std::thread t1(task1, std::ref(dlg));,其中dlgExperimentTabstd::ref 确保 dlg 将通过引用传递给线程。

顺便说一句:从其他线程更新 MFC 组件可能会导致一些数据争用。此外 - while(true) 线程将通过每秒多次更新以秒为分辨率的计时器消耗 100% 的 CPU。

【讨论】:

  • 感谢您的快速回复!我尝试了您的解决方案,但它只是给了我错误Error C2280 'ExperimentTab::ExperimentTab(const ExperimentTab &)': attempting to reference a deleted function
  • 也许我做的不对......但现在我收到一个错误,说未解析的外部符号 LNK2019
  • 所以代码编译,现在您缺少链接时间依赖项(不是项目中包含的所有文件?缺少库?)
  • @LiamP LNK2019 应该列出找不到哪个符号。如果它不是上述两个功能之一,您将需要一个新问题。遗憾的是,这个问题几乎会立即作为What is an undefined reference/unresolved external symbol error and how do I fix it? 的副本而被关闭
  • 好的,我解决了。我错过了注释掉另一个函数调用。抱歉,再问一个问题,我还在学习这个,我不知道打电话时要说什么mainThread();我收到错误too few arguments in function call
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多