Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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++ std::mem#fn代表班级成员赢得';不编译_C++_Qt_C++11 - Fatal编程技术网

C++ std::mem#fn代表班级成员赢得';不编译

C++ std::mem#fn代表班级成员赢得';不编译,c++,qt,c++11,C++,Qt,C++11,我正在尝试使用C++11和MSVC2013使用函数指针来拥有类中的成员函数 class MyClass { public: // ... QColor Colorize(double dValue) const; private: bool m_bUseColor1; QColor Color1(double dValue) const; QColor Color2(double dValue) const; }; 实施 QColor MyCl

我正在尝试使用C++11和MSVC2013使用函数指针来拥有类中的成员函数

class MyClass
{
    public:
    // ...
    QColor Colorize(double dValue) const;

private:
    bool m_bUseColor1;
    QColor Color1(double dValue) const;
    QColor Color2(double dValue) const;
};
实施

QColor MyClass::Colorize(double dValue) const
{
    auto colorize_func =  m_bUseColor1 ? std::mem_fn(&MyClass::Color1) : std::mem_fn(&MyClass::Color2);

    QColor myColor =  colorize_func(23.3);// FAILS TO COMPILE
}
这会产生以下错误:

错误102错误C2100:非法间接寻址C:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\include\xrefwrap 311 错误103错误C2296:“.*”:非法,左操作数的类型为“double”\C:\Program Files(x86)\Microsoft Visual Studio 12.0\VC\include\xrefwrap 311


你知道这里出了什么问题吗?我遵循了的语法,但显然有一个错误。

使用
colorize\u func(23.3)
需要类
MyClass
的实例来编译和运行。不仅仅是函数的参数

例如:

由于成员函数中已经使用了
colorize_func
,因此也可以使用
this

QColor myColor =  colorize_func(this, 23.3);
我应该这样做

无论如何,代码都是成员的一部分,也可以将代码简化为

QColor MyClass::Colorize(double dValue) const
{
  return (m_bUseColor ? Color1(dValue) : Color2(dValue));
}

关于它的说明及其使用(引用自cppreference.com)

函数模板
std::mem_fn
为指向成员的指针生成包装器对象,这些对象可以存储、复制和调用指向成员的指针。调用
std::mem\fn
时,可以使用对象的引用和指针(包括智能指针)

在所有情况下,提供给可调用包装器的第一个(或唯一一个)参数都是指向类实例的指针或引用

first\u argument\u type
T*
如果
pm
是指向使用一个参数的成员函数的指针


这些要求类似于旧的和旧的以及它们的使用方式。

通常的符号是
this->*colorize_func(23.3)
@TobySpeight。这是当
colorize_func
是普通成员函数指针时的表示法。在这里不是,它是一个对象(未指定类型),可以用来调用成员函数。@Niall-er,是的,你完全正确。右键,将函数绑定到的对象应该是函子调用的第一个参数。谢谢你告诉我这件事!您可能想引用,其中
std::mem_fun
的返回值被描述为“一个函数对象,它调用对象的成员函数f,该对象的指针作为(第一个)参数传递。如果成员函数接受一个参数,则该参数被指定为函数对象中的第二个参数。”(我的重点)
QColor MyClass::Colorize(double dValue) const
{
  return (m_bUseColor ? Color1(dValue) : Color2(dValue));
}