2

VS2008 SP1のドキュメントでは、std::tr1::mem_fun.

では、なぜ、 を使用しようとするとstd::tr1::mem_fun、このコンパイル エラーが発生するのでしょうか?:

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

同時に、std::tr1::function問題なく使用できます。

コンパイルしようとしているサンプルコードは次のとおりです。これは、のインスタンスを呼び出すことになっていTakesIntますTestfunction<void (int)>

#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私のコードを使用std::mem_funしてもコンパイルされないため、私は の tr1 バージョンを使用しようとしています! 問題が私のコードにあるのか、それとも tr1 のmem_fun. これは C++ コンパイラ エラーです (または、私だけかもしれません!)。


更新:そうですね。答えは mem_fn! と正しく綴ることです。

ただし、それを修正しても、コードはまだコンパイルされません。

コンパイラエラーは次のとおりです。

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

3 に答える 3

3

これを次のように変更します。

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);
于 2008-11-16T15:17:01.593 に答える
2

私は TR1 または VS2008 の専門家ではありませんが、簡単にグーグル検索すると、探している関数は代わりに std::tr1::mem_fn であることがわかります。(少なくとも、それは Boost がTR1 実装でそれを呼んでいるものであり、それがウィキペディアで詳細に説明されている方法です。)

ただし、古いバージョンの mem_fun でコンパイル エラーが発生する理由はわかりません。それに関するコンパイラのメッセージを投稿していただければ、私たちがそれを理解するのに役立つかもしれません.

于 2008-11-16T13:35:21.393 に答える
1

そのように 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)

2 番目の問題を解決するには、std::bind1st() を使用します。

  f=    std::bind1st(std::tr1::mem_fn(&Test::TakesInt), t);
于 2008-11-16T13:40:28.683 に答える