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;