2010-12-15 76 views
3

我有一個std::vector<std::string> temp_results,我想使用std :: for_each的去通過這個載體,將字符串,所以我炮製以下建築:的std :: stringstream的作爲參數傳遞給函數

std::stringstream ss; 
std::string res = std::for_each(temp_results.begin(), temp_results.end(), boost::bind(addup, _1, ss)); 

std::string addup(std::string str, std::stringstream ss) 
{ 
    ss << str; 
    ss << ";"; 

    return ss.str; 
} 

我得到以下錯誤,這是我無法理解的:

error C2475: 'std::basic_stringstream<_Elem,_Traits,_Alloc>::str' : forming a pointer-to-member requires explicit use of the address-of operator ('&') and a qualified name 
     with 
     [ 
      _Elem=char, 
      _Traits=std::char_traits<char>, 
      _Alloc=std::allocator<char> 
     ] 

請問某人請解釋什麼是錯的?

+1

也許是更好的,如果你通過了'引用stringstream'。 – 2010-12-15 08:28:55

回答

4

如果寫return ss.str;您打算從std::stringstream調用str成員函數,那麼會缺少一對括號:

return ss.str(); 

而且,你的代碼可能不會做你期望的。如果您希望每次撥打addup以使用相同的std::stringstream實例,則必須參考:修改addup簽名並在boost::bindss參數周圍添加boost::ref()

這裏是一個我相信做你所期望的工作版本:

void addup(std::string str, std::stringstream &ss) 
{ 
    ss << str; 
    ss << ";"; 
} 

int main() 
{ 
    std::vector<std::string> temp_results; 
    /* ... */ 

    std::stringstream ss; 
    std::for_each(temp_results.begin(), temp_results.end(), boost::bind(addup, _1, boost::ref(ss))); 
    std::cout << ss.str() << std::endl; 
} 

另一種使用boost::lambda

std::for_each(temp_results.begin(), temp_results.end(), ss << boost::lambda::_1 << ';'); 
+0

這是固定的,但現在它說boost :: bind不能把stringstream當作參數3,這樣就沒有這樣的重載了嗎? – 2010-12-15 08:28:09

+0

@Tony:看我的編輯 – icecrime 2010-12-15 08:44:40

相關問題