C++ std::mem#fn代表班级成员赢得';不编译
我正在尝试使用C++11和MSVC2013使用函数指针来拥有类中的成员函数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
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));
}