【问题标题】:Problem with very simple variadic function非常简单的可变参数函数的问题
【发布时间】:2021-07-19 00:18:51
【问题描述】:

我正在尝试使用 C++ 中的可变参数模板使用一个非常简单的日志函数:

void log(){}

template <typename T, typename... Types>
void log(T first, Types... arg)
{
    std::cout << first << " ";
    log(arg...);
}

int main()
{
    log(1,2);
    log(3, "four");
    log(5);
    log(6,"seven",8,9,10,11,12);
    log(13,14);

}

但在输出中,如果它们是整数(2、5、1214),我会丢失 log 函数的所有最后一个参数,但如果它们是字符串(“四个”)!??。这是为什么?我做错了什么?

output: 1 3 four 6 seven 8 9 10 11 13

【问题讨论】:

  • Cannot reproduce。您使用的是什么编译器和命令行开关?
  • Can't reproduce,或者。您只需要调试代码以找出不起作用的调用发生了什么。
  • 感谢@PaulSanders,这很吓人,我不知道使用什么特别的东西。它是最近安装的 Visual Studio 2021 中的一个新项目,没有任何进一步的修改。我也尝试了 VS2019 并得到了相同的结果。
  • 我可以在 VS 2019 上确认问题,并且似乎没有任何明显的解决方法。看起来像一个 MSVC 错误,尽管很难看出如此明显的问题是如何逃脱他们的注意的。
  • 同意,如果它真的是一个错误,那就太疯狂了。无论如何,我现在将摆脱可变参数函数:DD 谢谢。

标签: c++ templates variadic-templates


【解决方案1】:

谜团已解决 - 当使用 MSVC 进行编译时,当只有一个数字参数时,您选择的名称 log 与标准库中的 log 函数发生冲突。由于这不打印任何内容,因此缺少输出。

只需使用其他名称即可。

【讨论】:

  • “修复”#include 也是一种可能性:使用&lt;cmath&gt; 而不是&lt;math.h&gt;(并避免using namespace std;)。
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2011-04-13
  • 2014-11-13
相关资源
最近更新 更多