2012-03-24 17 views
0

"ファイル"というポインタのベクトルからstd :: mapを作成する際に問題があり、それぞれが3つのメンバ変数を持つオブジェクトを指しています。 "int size"マップのキーはサイズになり、値は同じ「サイズ」を持つオブジェクトの数になります。第2のものにあなたの時間を無駄にしないでください、それは私のプログラムの次のステップであり、私はすでにそれを考え出しました。マップの初期化では、値を返すので、std :: accumulateを使用しています。私はポインタをstd :: tr1 :: shared_ptrと述語関数のラムダ式を使用しています。C++ std :: accumulateを使ってマップを生成する<int,int>

map<int,int>* sizes = new map<int,int>(); 
    sizes = accumulate(files.begin(), files.end(),sizes, 
    [&sizes](map<int,int> acc, shared_ptr<CFileType>& obj) 
    { 
     return sizes->insert(pair<int,int>(obj->getSize(),0)); 
    }); 



error C2664: 'std::pair<_Ty1,_Ty2> `anonymous-namespace'::<lambda4>::operator()(std::map<_Kty,_Ty>,std::tr1::shared_ptr<CFileType> &) const' : cannot convert parameter 1 from 'std::map<_Kty,_Ty> ' to 'std::map<_Kty,_Ty>' 

私はラムダ関数に渡すものを非常にわからない、私はペアで試してみましたが、それは仕事をdidn`tの:私は、コンパイルで問題を抱えています。また、このマップは別の関数に返されるので、ポインタでなければならないことに注意してください。あなたからの助けをいただければ幸いです。ここでは、解決


問題は解決です:

map<int,int>* sizes = accumulate(files.begin(), files.end(), new map<int,int>(), 
    [](map<int,int>* acc, shared_ptr<CFileType>& obj)->map<int,int>* 
    { 
     acc->insert(pair<int,int>(obj->getSize(),0)); 
     return acc; 
    }); 

答えて

0

エラーメッセージは、std::map秒の2種類の間の型の不一致を持っているということです。 を呼び出し、accパラメータのために明らかに間違ったものを渡すコードにエラーがあるようです。良いニュースは、掲示されたラムダが実際にaccパラメータを使用することはないということです。

+0

私は持っている2種類の「マップ」はどちらですか?そして、不要なアルゴリズムを見つけてくれてありがとう、私は "acc"を使いたいが、ラムダ関数で "sizes"を使っている。 – Goshutu

+0

私は 'map'のうちの1つの型を知っていますが、私は他の型を見ません。しかし、エラーメッセージ "' std :: map <_Kty,_Ty> 'から' std :: map <_Kty,_Ty> ''にパラメータ1を変換することはできません。' _Kty'と '_Ty'の型を教えてくれません地図のそれぞれに実際にラムダを使用するときにラムダの最初のパラメータとして渡すものを見て、その型が 'std :: map 'とどのように違うのかを判断する必要があります。 –

+1

map.insert()はマップを返しませんが、それが挿入するペアを認識しませんでした。コードは今動作します。 – Goshutu

関連する問題