为什么编译器不能解析std :: function参数的重载?

Tre*_*key 0 c++ templates overloading std c++11

请注意以下示例:

#include <iostream>
#include <functional>
#include <cstdlib>

void Print_Wrapper(std::function<void(int)> function);
void Print(int param);

int main(){

  Print_Wrapper(Print);

  return EXIT_SUCCESS;
}

void Print_Wrapper(std::function<void(int)> function){
  int i = 5;
  function(i);
}
void Print(int param){
  std::cout << param << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这可以正常工作,并打印5.


现在看一下添加了重载函数的相同示例:

#include <iostream>
#include <functional>
#include <cstdlib>

void Print_Wrapper(std::function<void(int)> function);
void Print(int param);
void Print(float param);

int main(){

  Print_Wrapper(Print);

  return EXIT_SUCCESS;
}

void Print_Wrapper(std::function<void(int)> function){
  int i = 5;
  function(i);
}
void Print(int param){
  std::cout << param << std::endl;
}
void Print(float param){
  std::cout << param << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这给出了以下编译器错误:

main.cpp:11:22:错误:无法解析重载函数'打印'基于转换为'std :: function'类型
Print_Wrapper(打印);

有人可以解释为什么编译器无法解决重载?
Print_Wrapper只需要一个int函数 - 甚至不应该考虑浮点函数.


另外,我该怎么做才能解决这个问题?

我记得这样的问题,如果typename遗漏了某个或某些东西,那么这就要求我制作Print_Wrapper一个模板.
是否Print_Wrapper需要一个函数模板?

我想我会使用与此类似的功能,这只是有用的.例如:

#include <iostream>
#include <vector>
#include <cstdlib>

void Print_Wrapper(std::vector<int> param);
void Print(std::vector<int> param);
void Print(std::vector<float> param);

int main(){

  std::vector<int> vi{1,2,3};
  std::vector<float> vf{1.0,2.0,3.0};

  Print(vi); //prints int
  Print(vf); //prints float

  Print_Wrapper(vi); //prints int (no overload issue)
  Print_Wrapper(vf); //compiler error (as expected)

  return EXIT_SUCCESS;
}

void Print_Wrapper(std::vector<int> param){
  Print(param);
  return;
}
void Print(std::vector<int> param){
  std::cout << "int" << std::endl;
}
void Print(std::vector<float> param){
  std::cout << "float" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

所以我认为这个问题存在于实际C++函数的查找规则中,因为这个例子只使用了类型.思考?

Ste*_*oft 5

在C++ 11中,std::function构造函数可以获取任何可调用对象,即使它是格式错误的,也无法调用该对象.在C++ 14中,重载分辨率是固定的,但是可以调用这两个函数,int因此两者都是有效的候选者.

您需要明确请求正确的功能:

Print_Wrapper(static_cast<void(*)(int)>(Print))
Run Code Online (Sandbox Code Playgroud)