【问题标题】:How do I use std::tr1::mem_fun in Visual Studio 2008 SP1?如何在 Visual Studio 2008 SP1 中使用 std::tr1::mem_fun?
【发布时间】:2023-03-30 11:35:02
【问题描述】:

VS2008 SP1 文档谈到了 std::tr1::mem_fun

那么,当我尝试使用 std::tr1::mem_fun 时,为什么会出现这个编译错误?:

'mem_fun' : is not a member of 'std::tr1'

同时,我可以毫无问题地使用std::tr1::function

这是我正在尝试编译的示例代码,它应该通过function<void (int)>Test 的实例上调用TakesInt

#include "stdafx.h"
#include <iostream>
#include <functional>
#include <memory>

struct Test { void TakesInt(int i) { std::cout << i; } };

void _tmain() 
{
    Test* t = new Test();

    //error C2039: 'mem_fun' : is not a member of 'std::tr1'
    std::tr1::function<void (int)> f =
        std::tr1::bind(std::tr1::mem_fun(&Test::TakesInt), t);
    f(2);
}

我正在尝试使用 mem_fun 的 tr1 版本,因为使用 std::mem_fun 时,我的代码也无法编译!我无法从编译器错误中判断问题是出在我的代码上,还是可以通过使用 tr1 的 mem_fun 来解决。那是你的 C++ 编译器错误(或者可能只是我!)。


更新:正确。答案是正确拼写为 mem_fn!

但是,当我修复它时,代码仍然无法编译。

这是编译器错误:

error C2562: 
'std::tr1::_Callable_obj<_Ty,_Indirect>::_ApplyX' :
  'void' function returning a value

【问题讨论】:

  • 使用 std::mem_fun 时遇到的编译错误是什么?

标签: c++ std tr1 mem-fun


【解决方案1】:

改成这样:

std::tr1::function<void (int)> f =
    std::tr1::bind(std::tr1::mem_fn(&Test::TakesInt), t, std::tr1::placeholders::_1);
f(2);

活页夹需要 int 参数。所以你必须给它一个占位符,它代表生成的函数对象需要的整数参数。

顺便说一句:我不确定你是否已经知道这一点。但是你不需要那个 mem_fn 。改成

std::tr1::function<void (int)> f =
    std::tr1::bind(&Test::TakesInt, t, std::tr1::placeholders::_1);
f(2);

【讨论】:

  • 谢谢!我刚刚弄清楚 _1 的来源,并回来用修复更新我的问题。
  • 好的,所有答案都让我更接近解决方案,所以我很难选择接受哪一个。但很遗憾,我只能接受一个。我认为这显示了实现我想要的最干净的方法,使用 tr1 添加,但我对所有其他的都投了赞成票。谢谢大家。
【解决方案2】:

我不是 TR1 或 VS2008 方面的专家,但快速谷歌搜索表明您正在寻找的函数是 std::tr1::mem_fn 。 (至少,Boost 在他们的 TR1 implementation 中是这样称呼它的,这就是它在 Wikipedia 上的详细说明。)

我不知道为什么你在使用旧版本的 mem_fun 时会出现编译错误。如果您发布编译器对此的消息,它可能会帮助我们弄清楚。

【讨论】:

    【解决方案3】:

    要像这样使用 mem_fun,您需要完全指定所有模板参数(因为 mem_fun 是一个类,并且不会对类进行自动模板参数推导)。 mem_fun 也只有一个带 0 个参数的默认构造函数。

    没有完整的类定义很难得到正确的定义。
    但我对你想要的最好的选择是:(或接近的东西)

     std::tr1::mem_fun<Test,void (Test::*)(Test*),&Test::TakesInt>()
    

    我认为您正在寻找的是 mem_fn()。这是一个返回 mem_fun 类型对象的函数。因为它是一个函数,自动进行模板参数推导。

      std::tr1::mem_fn(&Test::TakesInt)
    

    要解决第二个问题,请使用:std::bind1st()

      f=    std::bind1st(std::tr1::mem_fn(&Test::TakesInt), t);
    

    【讨论】:

    • struct Test 在示例代码中完全定义。我使用 mem_fn 时遇到的编译器错误更新了问题。
    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多