2011-06-22 28 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 >&)’

我怎麼做它在正常的循環? 獎金問題:我如何在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

好的,調用map函數怎麼樣? 我也可以用TYPE&來稱呼它嗎? – DavidBobo

+0

什麼地圖功能? –

+0

AddXmlOfContAttribute(std :: pair tpair) – DavidBobo

0

的編譯錯誤來源於此行:

AddXmlOfContAttribute(it_begin); 

這應該是:

AddXmlOfContAttribute(*it_begin); 

我是白癡我不」沒有意識到第一個超載......那應該是sc說的參考。