【发布时间】:2015-04-23 08:40:55
【问题描述】:
观察下面的例子:
#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;
}
这可以正常工作,并打印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;
}
这会产生以下编译器错误:
main.cpp:11:22:错误:无法解析重载函数“打印” 基于转换为“std::function”类型
Print_Wrapper(打印);
能否解释一下为什么编译器无法解决重载问题?Print_Wrapper 只需要一个 int 函数——甚至不应该考虑 float 函数。
另外,我应该怎么做才能解决这个问题?
我记得如果遗漏了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;
}
所以我认为问题出在实际 C++ 函数的查找规则中,因为此示例仅使用类型。想法?
【问题讨论】:
-
std::vector
无法转换为 std::vector 但 int 可以隐式转换为 float -
static_cast<void(*)(int)>(&Print) -
@Sarang 好的,如果我使用无法隐式转换的完全不同的类型,我认为问题仍然存在。
标签: c++ templates c++11 std overloading