2016-10-05 14 views
1

2つのリストと名前があります。検索する名前が最初のリストにない場合は、2番目のリストにわずかに異なる形式で表示されます。 2つの形式間の変換関数が与えられています。表示された新しいペアをstd :: map <CString、CString>に挿入します。

std::map<CString, CString>* convertedNames; 

BOOL CSome::SeekNameWithConversion(std::set<CString> names, CString nameToFind) 
{ 
    for (auto it = names.begin(); it != names.end(); ++it) 
    { 
     if (nameToFind.Compare(*it) == 0) return true; 

     auto convertedIt = convertedNames->find(*it); 
     if (convertedIt != convertedNames->end() && 
      nameToFind.Compare(convertedIt->second) == 0) 
      return true; 

     CString justConvertedName = ConvertToTheOtherFormat(nameToFind); 
     convertedNames->insert(*it, justConvertedName); // Error here 
     return nameToFind.Compare(justConvertedName) == 0; 
    } 
} 

エラーは次のとおりです。

error C2675: unary '++': 
'ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<_CharType>>>' does 
not define this operator or a conversion to a type acceptable to the 
predefined operator 

私はオペレータ++がここに関与している理由を知りたいのですが、その後どのように私はこのエラーを処理する必要があります。

+0

'std :: set names' - 値ではなく、const参照で渡す必要があります。 – PaulMcKenzie

+0

@PaulMcKenzie確かに、ありがとう。 – tomab

答えて

0

さまざまなinsertの機能のほとんどは、std::mapのイテレータが必要です。代わりに、あなたは(私が思うCString、である)、尖ったツーオブジェクトを渡す:

convertedNames->insert(*it, justConvertedName); 
         ^^^ 
         this is a CString, not a std::map<CString,CString>::iterator 

あなたはキーと値のペアを挿入したい場合は、基本的に作られたstd::pairである代わりに、マップのvalue_typeを使用キーと値のアップ:

convertedNames->insert(std::make_pair(*it, justConvertedName)); 
0

最初に理解しなければならないのは、必要なクラスがそのオブジェクトで構築されているように、テンプレートが常にヘッダーに完全に実装されていることです(std libに可能なすべてのstd :: vector実装が組み込まれていると考えてください)。

これは、テンプレートの実装が公開されていることを意味します。この場合は、どこかに++があります。エラー全体が表示された場合(それはかなりの数の行になります)、間違っているパラメータがあるかもしれません。いずれの場合においても

、我々は明確にCStringのことになるだろう*それを見ることができますが、私はこの

が...

がある他の形式に変換することを推測すると思いますおそらくあなたの考えを返すことはありません

+0

私は変換メソッドから来るCStringがあることを明確にするために質問を編集しました。 – tomab

1

map::insertの最初の引数は、イテレータであり、CStringではありません。内部的に、メソッドはイテレータをインクリメントしようとしています。これは明らかにoperator++を呼び出します。この挿入オーバーロードを使用する必要はありません。これは、要素が挿入される場所の近くの位置を知っているときに、パフォーマンスを向上させることを意図しています。代わりにconvertedNames->insert(std::make_pair(*it, justConvertedName))に電話するだけです。

+0

キーと値の2つの値はありませんか? – tomab

+0

はい。私はこの例を誤解している。私は私の答えを更新しました。ありがとう。 –

+0

私は出てきた最初の良い答えを受け入れました。 – tomab

関連する問題