2011-01-26 8 views
1

これは私の最初の質問です。私はあきらめて、手巻きのファンクタを使っていますが、どうやってやろうとしているのか不思議です。以下のような実際の例は、ベクトルのすべてのベクトルのサイズを、サイズが9であるように、NULLで埋めてサイズ変更することを意図しています。示された行はMinGW GCC 4.5.0に多くのテンプレートエラーを吐き出させます。私はいくつかの異なる順列を試しましたが、以下で「正しいに近い」と考えられるコードを掲載しました。どのように書かれていますか?注意しておきたいのは、引数の2つの引数を保持することです。for_eachベクトルサイズのバインドベクトル

#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; 
} 

ありがとうございます。

答えて

1

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

+0

アムノンの答えが私のために働いた。ファンクタアプローチを探している人のために、私は以下でした テンプレート クラスresize_functor { 公共: \t resize_functor(size_tのサイズ、T値):size_(サイズ)、VALUE_(値){}。 \tテンプレート void operator()(C&container){ \t \t container.resize(size_、value_); \t} プライベート: \t size_t size_; \t T value_; }; ... for_each(stacked_vector.begin()、stacked_vector.end()、resize_functor (9u、0)); –

+0

私はコメントにコードタグを追加する方法を見ることができました... –

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); 
} 

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

関連する問題