【问题标题】:Can't pass arguments to thread function无法将参数传递给线程函数
【发布时间】:2014-11-13 22:28:44
【问题描述】:

好的,我正在尝试在 c++ 中创建一个运行函数storePose(); 的线程,该函数需要九个参数作为双精度数。每次我尝试创建线程时,它都会抱怨参数。我将在下面发布我的代码。我不知道为什么这不起作用。提前致谢

代码:

std::thread t(storePose,x_position, y_position, z_position, azimuth, att_pitch, att_roll, yaw, cam_pitch, cam_roll);
    t.detach();

错误:

    12  IntelliSense: no instance of constructor "std::thread::thread" matches the argument list
        argument types are: (<unknown-type>, double, double, double, double, double, double, double, double, double)

编辑: 抱歉,我忘了说我使用的是 Visual Studio 2012

【问题讨论】:

  • 'Intellisense' 什么?请您至少指定您的实际 IDE!
  • 对不起 Visual Studio 2012

标签: c++ multithreading visual-studio-2012


【解决方案1】:

Microsoft Visual C++ (2012) 不支持可变参数模板。他们有一种叫做 faux variadics 的东西,可以通过宏来消除重载。问题是您可以传递给可变参数模板的参数数量有限制,默认情况下限制为 5。您可以通过将 _VARIADIC_MAX 定义为更大的数字来调整限制(例如,限制为 10设置/D_VARIADIC_MAX=10)

请参阅 thisthis

【讨论】:

  • 谢谢你,这可以帮助我,我究竟把它放在哪里?抱歉,我对这种类型的编程比较陌生
  • 在解决方案资源管理器中右键单击您的项目。选择 Properties... 并导航到 C/C++ -> Preprocessor 并将 add _VARIADIC_MAX=10 设置为“Preprocessor Definitions”。确保对项目的所有配置(调试、发布等)都这样做
  • 非常感谢。我已经搞砸了几个小时,这对我来说有点太高了!再次非常感谢你,如果我能得到一个好的答案,我不确定为什么它会被两次否决!谢谢!
  • 如果您不介意查看我的新 Question HERE,在切换到 Boost 线程后我再次遇到此错误。
【解决方案2】:

参数太多,把它们放在一个struct中,然后把struct交给线程函数处理struct中的args。

【讨论】:

  • 我会试试这个,但我确实尝试将参数放在一个向量中,只是重载了函数,它仍然给我一个非常相似的错误
  • storePos 函数的签名是否与给定的参数匹配?
  • 是的,函数在我的标题中声明为:void storePose(double lat, double lon, double alt, double attYaw, double attPitch, double attRoll, double camYaw, double camPitch, double camRoll);
  • 当我尝试的时候是void storePose(vector&lt;double&gt; params);
猜你喜欢
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 2011-02-18
  • 1970-01-01
  • 2015-03-08
相关资源
最近更新 更多