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++函数的查找规则中,因为这个例子只使用了类型.思考?
在C++ 11中,std::function构造函数可以获取任何可调用对象,即使它是格式错误的,也无法调用该对象.在C++ 14中,重载分辨率是固定的,但是可以调用这两个函数,int因此两者都是有效的候选者.
您需要明确请求正确的功能:
Print_Wrapper(static_cast<void(*)(int)>(Print))
Run Code Online (Sandbox Code Playgroud)