这个在std::vector
中存储函数的程序可以在linux上使用g ++ 7.2.0,但是不能在带有visual c ++ 2017 v15.5.4的windows上编译
该错误适用于向量中的sin()
,cos()
,tan()
:
E0289 cannot determine which instance of overloaded function "sin" is intended.
我没有看到如何修改它以便它也适用于Windows。
#include <vector>
#include <cmath>
#include <functional>
#include <iostream>
typedef std::function<double(double)> AFunc;
std::vector<AFunc> funcs = {
sin,
cos,
tan,
[](double x) { return x*x; },
};
int main()
{
std::cout << funcs[0](2) << std::endl;
std::cout << funcs[1](2) << std::endl;
std::cout << funcs[2](2) << std::endl;
std::cout << funcs[3](2) << std::endl;
}
答案 0 :(得分:3)
我不知道如何修改它以便它也能在Windows上运行。
如何投射到所请求的类型?
std::vector<AFunc> funcs = {
static_cast<double(*)(double)>(&sin),
static_cast<double(*)(double)>(&cos),
static_cast<double(*)(double)>(&tan),
[](double x) { return x*x; },
};
答案 1 :(得分:3)
sin
,cos
和tan
在多个重载中提供(针对各种浮点类型),因此引用它们的名称并不足以准确解析哪个函数你的意思是。您可以使用@ max66 answer中的强制转换解决歧义,或者只使用lambda,这是IMO更清晰的语法和更少的输入:
std::vector<AFunc> funcs = {
[](double x) { return sin(x); },
[](double x) { return cos(x); },
[](double x) { return tan(x); },
[](double x) { return x*x; },
};