2011-06-22 8 views
0

私はコンテナ(マップ、セット、ベクトル、リスト)と配列を同じ方法でループしようとしています。ここで コードです:配列と同じ方法でループします

template<typename TYPE> 
void AddXmlOfContAttribute(TYPE *it) 
{ 
    m_ss<<"<SingleNode "; 
    AddXmlAttribute("Value" , *it); 
    m_ss<<"/>\n"; 
} 



template<typename TYPE1,typename TYPE2> 
void AddXmlOfContAttribute(std::pair<TYPE1,TYPE2> tpair) 
{ 
    m_ss<<"<MapNode "; 
    AddXmlAttribute("key" , tpair->first); 
    AddXmlAttribute("Value" , tpair->second); 
    m_ss<<"/>\n"; 
} 




template<typename TYPE> 
    void AddContainerToXml(std::string str, TYPE it_begin , TYPE it_end) 
    { 
     if(it_begin != it_end) 
     { 
      m_ss<<"<"<<str<<">\n"; 

      //std::for_each(it_begin , it_end, AddXmlOfContAttribute); 

      for(; it_begin != it_end ; it_begin++) 
       AddXmlOfContAttribute(it_begin); 

      m_ss<<"</"<<str<<">\n"; 
     } 
    } 

私は次のエラーを取得する:

In member function ‘void AddElementToBackupFileFunctor::AddContainerToXml(CrString, TYPE, TYPE) [with TYPE = std::_Rb_tree_const_iterator >]’ instantiated from here error: no matching function for call to
AddElementToBackupFileFunctor::AddXmlOfContAttribute(std::_Rb_tree_const_iterator >&)’

iは、通常のループでそれをどのように行うのですか? ボーナスに関する質問:for_eachループではどうすればよいですか?

答えて

1

つまり、要するに、あなたが必要とするすべてを説明する必要がある例を作成しましたhere

あなたが欲しいものを行うためには、まず、静的メソッド(あなたが部分的にhereを参照してください、関数テンプレートを特化することはできませんので、これが必要です)を構造体にあなたのハンドラを変更する必要があります。

template<typename TYPE> 
struct value_handler { 
    static void AddXmlOfContAttribute(AddElementToBackupFileFunctor& context, 
             TYPE value) { 
     // handle normal values here 
     // context replaces this-pointer 
    } 
}; 

// partial specialization for pairs 
template<typename TYPE1, typename TYPE2> 
struct value_handler<std::pair<TYPE1, TYPE2> > { 
    static void AddXmlOfContAttribute(AddElementToBackupFileFunctor& context, 
             std::pair<TYPE1, TYPE2> value) { 
     // handle values that are pairs here 
     // context replaces this-pointer 
    } 
}; 

value - パラメータは参考にすることはできません。それはstd::bind1stを駄目にするからです(Boostを使用する回避策はhereと記載されています)。 std::for_eachでこれを使用するには、次の手順を実行します。

std::for_each(begin, end, std::bind1st(
    std::ptr_fun(&AddElementToBackupFileFunctor::value_handler<typename TYPE::value_type>::AddXmlOfContAttribute), 
    *this)); 
+0

ここで、マップ関数の呼び出しはどうですか? TYPE&?でも電話することはできますか? – DavidBobo

+0

マップ機能は何ですか? –

+0

AddXmlOfContAttribute(std :: pair tpair) – DavidBobo

0

コンパイルエラーがこの行から来ている:

AddXmlOfContAttribute(it_begin); 

これは次のようになります。

AddXmlOfContAttribute(*it_begin); 

私は「didnのバカです最初の過負荷を実現する...それはscと同じように参照する必要があります。

関連する問題