Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;带有重载成员函数的std::mem_fn_C++_C++11_Function Pointers - Fatal编程技术网

C++ C++;带有重载成员函数的std::mem_fn

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

编译以下代码时,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-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));