C++ C++;带有重载成员函数的std::mem_fn
编译以下代码时,Visual Studio会报告:C++ C++;带有重载成员函数的std::mem_fn,c++,c++11,function-pointers,C++,C++11,Function Pointers,编译以下代码时,Visual Studio会报告: \main.cpp(21): error C2664: 'std::_Call_wrapper<std::_Callable_pmd<int ClassA::* const ,_Arg0,false>,false> std::mem_fn<void,ClassA>(int ClassA::* const )' : cannot convert argument 1 from 'overloaded-funct
\main.cpp(21): error C2664: 'std::_Call_wrapper<std::_Callable_pmd<int ClassA::* const ,_Arg0,false>,false> std::mem_fn<void,ClassA>(int ClassA::* const )' : cannot convert argument 1 from 'overloaded-function' to 'int ClassA::* const '
1> with
1> [
1> _Arg0=ClassA
1> ]
1> Context does not allow for disambiguation of overloaded function
在C++11中引入了,但在C++14中删除了。指定特定重载的方法是将函数类型指定为第一个模板参数(第二个模板参数,即类类型,可以省略,因为它可以推断):
注意,在gcc上,两个版本都会给出错误。您正在使用哪个版本的Visual Studio?为什么使用std::mem_fn而不是lambda?由于您使用的是auto,显然它是一个相当现代的编译器,您不必玩弄几乎完全不属于您的std::mem_fn、std::bind等@metal,Visual Studio 2013伟大的答案+1。我如何自己找到这些信息?《标准》涵盖了这些吗?@FrankLiu我从中获得了这些信息-这是一个更好的参考资料,涵盖了标准版本之间的差异。@ectmur,emm…,我读过同一个网站,但我没有找到答案。在他们的示例中,autoc=std::mem_fn(&X::get);没有静态类型转换,他们没有将类名指定为第二个模板参数。@FrankLiu好的,第二个模板参数可以从函数参数中推导出来。@ectmur,auto mem_fptr1=std::mem_fn(&ClassA::memberfunction);根据VS 2013给出错误C2770
class ClassA
{
public:
void memberfunction()
{
std::cout <<"Invoking ClassA::memberfunction without argument" << std::endl;
}
void memberfunction(int arg)
{
std::cout << "Invoking ClassA::memberfunction with integer " << arg << std::endl;
}
};
int main()
{
auto mem_fptr1 = std::mem_fn<void, ClassA>(&ClassA::memberfunction);
auto mem_fptr2 = std::mem_fn<void, ClassA, int>(&ClassA::memberfunction);
mem_fptr1(ClassA());
mem_fptr2(ClassA(), 3);
}
auto mem_fptr1 = std::mem_fn<void()>(&ClassA::memberfunction);
auto mem_fptr2 = std::mem_fn<void(int)>(&ClassA::memberfunction);
auto mem_fptr1 = std::mem_fn(
static_cast<void (ClassA::*)()>(&ClassA::memberfunction));
auto mem_fptr2 = std::mem_fn(
static_cast<void (ClassA::*)(int)>(&ClassA::memberfunction));