1

これは私の最初の質問です。私はあきらめて、これには手巻きファンクターを使用しますが、それがどのように行われることになっているのか興味があります。以下の不自然な例は、ベクトル内のすべてのベクトルのサイズを 9 に変更することを目的としており、それらを null で埋めます。示された行により、MinGW GCC 4.5.0 は多くのテンプレート エラーを吐き出します。いくつかの異なる順列を試しましたが、「最も正しい」と思われるコードのみを以下に掲載しました。それはどのように書かれるべきですか?resize の 2 つの引数バージョンを保持したいことに注意してください。

#include <vector>
using std::vector;
#include <algorithm>
using std::for_each;
#include <tr1/functional>
using std::tr1::bind;
using std::tr1::placeholders::_1;

int main() {
 vector<vector<void *> > stacked_vector(20);
 for_each(stacked_vector.begin(),stacked_vector.end(),
  bind(&std::vector<void *>::resize,_1,9,0/*NULL*/));  // voluminous error output
 return 0;
}

ご意見をお寄せいただきありがとうございます。

4

2 に答える 2

1

エラー出力を見ずに言うのは難しいです (率直に言って、エラー出力があっても)。ただし、NULL をvoid*型として渡してみてください: static_cast<void*>(0)。そうでない場合、 によって返されるオブジェクトはbind、 の 2 番目のパラメータとして int 値を与えようとしますresize

于 2011-01-26T21:21:18.963 に答える
0

これを試して。

#include <functional> 
#include <algorithm> 
#include <iostream> 
#include <vector>


int main() 
{ 
    typedef std::vector<int> vec_int;
    typedef std::vector<vec_int> vec_vec_int;

    // Do this to make the   _1    work
    using namespace std::placeholders; 

    static const int FIRST_DIM = 5;
    static const int SECOND_DIM = 10;
    static const int DEFAULT_VALUE = 66;

    vec_vec_int v(FIRST_DIM);

    std::for_each(v.begin(), v.end(), 
        std::bind(&vec_int::resize, _1, SECOND_DIM, DEFAULT_VALUE));

    std::cout << v[4][9];

    return (0); 
} 

デフォルト値を指定しない場合は、指定する必要はありません。

于 2012-03-14T16:45:59.063 に答える