在std :: vector中存储函数在linux上运行正常但是甚至不能在windows上编译

时间:2018-01-21 12:58:15

标签: c++ c++11 overloading

这个在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;

}

2 个答案:

答案 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)

sincostan在多个重载中提供(针对各种浮点类型),因此引用它们的名称并不足以准确解析哪个函数你的意思是。您可以使用@ 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; },
};