gpt4 book ai didi

c++ - 为什么将 `printf` 作为模板函数参数传递成功但 `cos` 失败 (msvc 19)?

转载 作者:行者123 更新时间:2023-12-04 14:01:25 25 4
gpt4 key购买 nike

我正在 link 上玩在线 C++ 编译器.但是下面的代码片段在使用 msvc v19.latest 编译时失败了。

#include <iostream>
#include <cmath>
#include <cstdio>

template<class F, class...L>
void test(F f, L...args) {
std::cout<< "res = " << f(args...) << '\n';
}


int main()
{
test(cos, 0.1); #1
test(printf, "%s", "aaa"); #2
}

怎么可能2号线没问题,1号线就通不过呢?

MSVC 对下面的代码很满意,但这次轮到 GCC 拒绝它了。 MSVC 的 iostream 文件包括 cmath 头和 GCC#undefs cos :)

#include <stdio.h>
#include <math.h>
//#include <iostream>

template<class F, class...L>
void test(F f, L...args) {
f(args...);
}

int main()
{
test(cos, 0.1);
test(printf, "%s", "aaa");
}

从 c++20 开始,第二个答案中提出了另一个问题,并已在这个问题中得到解决 link

最佳答案

失败是因为 cos 是 msvc 中的重载函数。这意味着至少有 3 个不同版本的 cos:

float cos(float arg);
double cos(double arg);
long double cos(long double arg);

编译器无法猜测您正在尝试使用哪个,但您可以通过使用 static_cast 来帮助它,如下所示:

int main()
{
test(static_cast<double(*)(double)>(cos), 0.1);
test(printf, "%s", "aaa");
}

关于c++ - 为什么将 `printf` 作为模板函数参数传递成功但 `cos` 失败 (msvc 19)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69945844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com