C++ 将std::函数与函数指针作为参数传递时出错

C++ 将std::函数与函数指针作为参数传递时出错,c++,c++11,function-pointers,std-function,C++,C++11,Function Pointers,Std Function,我有下面的一段代码,其中我声明了两个函数,它们将函数作为参数(一个使用std::function,另一个使用指向函数的指针)。作为参数的函数必须具有原型std::complex(const std::complex&)。此类参数的一个示例是C++11中的std::sqrt,请参阅。现在,我完全不知道为什么使用指向函数指针的函数可以工作(即g_of u ten),而另一个使用std::function作为参数的函数不能工作(即f_of u ten)。如果我取消对该行的注释 //cout <&

我有下面的一段代码,其中我声明了两个函数,它们将函数作为参数(一个使用
std::function
,另一个使用指向函数的指针)。作为参数的函数必须具有原型
std::complex(const std::complex&
)。此类参数的一个示例是C++11中的
std::sqrt
,请参阅。现在,我完全不知道为什么使用指向函数指针的函数可以工作(即
g_of u ten
),而另一个使用
std::function
作为参数的函数不能工作(即
f_of u ten
)。如果我取消对该行的注释

//cout << f_of_ten(std::sqrt) << endl; // ERROR here!!!

PS:当然,我也试过
cout有多个
std::sqrt
重载,而您的代码不知道如何确定您想要哪个

尝试:

typedef cplx(*复数函数)(常量cplx&);

std::coutstd::sqrt有多个重载,您的代码不知道如何确定您想要哪个

尝试:

typedef cplx(*复数函数)(常量cplx&);

std::coutstd::sqrt有多个重载,您的代码不知道如何确定您想要哪个

尝试:

typedef cplx(*复数函数)(常量cplx&);

std::coutstd::sqrt有多个重载,您的代码不知道如何确定您想要哪个

尝试:

typedef cplx(*复数函数)(常量cplx&);

std::cout坏主意,请参阅评论和编辑

如果使用
std::sqrt
代码,则复数的
std::sqrt
是一个模板

不知道为什么g。。。你工作得很好

编辑以挽救此答案:

您可以使用lambda选择正确的
sqrt
like

std::cout << f_of_ten([](cplx x){return std::sqrt(x);}) << std::endl;

std::cout坏主意,请参阅评论和编辑

如果使用
std::sqrt
代码,则复数的
std::sqrt
是一个模板

不知道为什么g。。。你工作得很好

编辑以挽救此答案:

您可以使用lambda选择正确的
sqrt
like

std::cout << f_of_ten([](cplx x){return std::sqrt(x);}) << std::endl;

std::cout坏主意,请参阅评论和编辑

如果使用
std::sqrt
代码,则复数的
std::sqrt
是一个模板

不知道为什么g。。。你工作得很好

编辑以挽救此答案:

您可以使用lambda选择正确的
sqrt
like

std::cout << f_of_ten([](cplx x){return std::sqrt(x);}) << std::endl;

std::cout坏主意,请参阅评论和编辑

如果使用
std::sqrt
代码,则复数的
std::sqrt
是一个模板

不知道为什么g。。。你工作得很好

编辑以挽救此答案:

您可以使用lambda选择正确的
sqrt
like

std::cout << f_of_ten([](cplx x){return std::sqrt(x);}) << std::endl;



std::cout问题是模板参数推断不会实例化模板来查找匹配项,因此您需要使用
std::sqrt
好的,我现在正好找到了:)谢谢,这确实是个问题。@PeterT不能保证
std::sqrt
作为
template
函数存在,或者有一个,或者它的第一个
template
参数就是它的参数类型。@Yakk他使用的这个函数是一个模板function@Yakk,至少他们在标准C++11中是这么说的,
std::sqrt
是为复数模板化的。问题是模板参数推断不会实例化模板以找到匹配项,因此您需要使用
std::sqrt
好的,实际上我现在正好找到了:)无论如何,谢谢,这确实是问题所在。@PeterT不能保证
std::sqrt
作为
template
函数存在,或者有一个,或者它的第一个
template
参数就是它的参数类型。@Yakk他使用的这个函数是一个模板function@Yakk,至少他们在标准C++11中是这么说的,
std::sqrt
是为复数模板化的。问题是模板参数推断不会实例化模板以找到匹配项,因此您需要使用
std::sqrt
好的,实际上我现在正好找到了:)无论如何,谢谢,这确实是问题所在。@PeterT不能保证
std::sqrt
作为
template
函数存在,或者有一个,或者它的第一个
template
参数就是它的参数类型。@Yakk他使用的这个函数是一个模板function@Yakk,至少他们在标准C++11中是这么说的,
std::sqrt
是为复数模板化的。问题是模板参数推断不会实例化模板以找到匹配项,因此您需要使用
std::sqrt
好的,实际上我现在正好找到了:)无论如何,谢谢,这确实是问题所在。@PeterT不能保证
std::sqrt
作为
template
函数存在,或者有一个,或者它的第一个
template
参数就是它的参数类型。@Yakk他使用的这个函数是一个模板function@Yakk,至少他们在标准C++11中是这么说的,那
std::sqrt
是为复数模板化的。没错,如果
std::function
不能推导出
T
,为什么指针版本可以这样做?@vsoftco
#include
而上述操作失败了,因为无法保证正好有一个
模板sqrt
函数,上面的内容很脆弱,可以在任何时候无缘无故地被破坏。@Yakk-Welp,那么我的答案是垃圾,将被删除。谢谢你的反馈。@Yakk,看看我更新的代码,即使使用
valarray它也能正常工作
included@vsoftco欢迎使用edg上的东西
std::cout << f_of_ten([](cplx x){return std::sqrt(x);}) << std::endl;