Observe the following example:
#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;
}
This works correctly, and prints 5.  
Now look at the same example with an overloaded function added:
#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;
}
This gives the following compiler error:
main.cpp:11:22: error: cannot resolve overloaded function ‘Print’ based on conversion to type ‘std::function’
Print_Wrapper(Print);
Could some explain why the compiler can't resolve the overload?
Print_Wrapper only expects an int function-- the float function shouldn't even be considered.  
Additionally, what should I do to fix this?
I recall problems like this occurring if a typename or something was left out, but then that would require me to make Print_Wrapper a template.
Does Print_Wrapper need to be a function template?  
I guess I'm use to functionality similar to this, that just works. For example:
#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;
}
So I think the issue lies somewhere in the lookup rules of an actual C++ function, as this example only uses types. Thoughts?