【问题标题】:error when storing a reference to a method in C++11在 C++11 中存储对方法的引用时出错
【发布时间】:2013-08-13 04:01:00
【问题描述】:

我想使用 lambda 函数,但我有一个问题:

如果我想将在“全局范围”中声明的函数的引用存储为 std::function,没有问题:

int myFunction()
{
    return 665;
}
int main()
{
    function<int()> functionRef = myFunction; //This works
}

如果我想做同样的事情但存储对方法的引用:

//A class
class myClass
{
    public:
        int myMethod() 
        {
            return 666;
        }
};

//I create an instance:
myClass myInstance;

int main()
{
    function<int()> functionRef2 = myInstance.myMethod; //This doesn't work... why?
}

给我这个错误:

错误 C3867:'myClass::myMethod':函数调用缺少参数列表;使用 '&myClass::myMethod' 创建指向成员的指针

我知道当您调用没有“()”的函数时会发生错误,但在这种情况下我没有调用函数。只需将其存储在变量中。 我正在使用 Visual C++ 2010。 感谢您的帮助。

【问题讨论】:

  • myInstance.myMethod 使用此调用并且不是 int() 类型。
  • 对不起,我没明白,你能解释一下吗?
  • myMethod 取决于它使用它的实例,并隐式地将实例的“this”指针作为参数,这就是它的签名不是 int() 的原因。我发布了一个答案,该答案使用 std::bind 将实例绑定到使其可作为 int() 调用的方法

标签: c++ visual-c++ c++11 lambda


【解决方案1】:

myClass::myMethod 的类型是 int (myClass::*)(),这与 int(*)() 不同

你可以使用的是

function<int()> functionRef2 = std::bind(&myClass::myMethod, &myInstance);

【讨论】:

  • 成功了,感谢您的帮助!现在我对此还有 1 个问题:我可以在第一个示例中使用绑定函数吗?替换这个:'function functionRef = myFunction;'有这样的东西吗?:std::bind(&myFunction, &myFunction);
  • 是的,你可以这样做:std::bind(myFunction);查看 std::bind 文档以了解它是如何工作的,你可以用它做更多的事情
【解决方案2】:

作为bind 的替代方案,您可以使用 lambda:

function<int()> functionRef2 = [&](int n){ return myInstance.myMethod(n); };

【讨论】:

    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多