我有一个std::vector<std::string> temp_results
,我希望使用std :: for_each来浏览这个向量并连接一个字符串,所以我编写了以下结构:
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>
]
有人可以解释一下是什么问题吗?
答案 0 :(得分:4)
如果通过编写return ss.str;
打算从str
调用std::stringstream
成员函数,那么您缺少一对括号:
return ss.str();
此外,您的代码可能不会按预期执行。如果您希望对addup
的每次调用都在同一个std::stringstream
实例上工作,则必须通过引用来修改:修改addup
签名并在boost::ref()
周围添加ss
boost::bind
中的{1}}参数。
这是一个我认为符合你期望的工作版本:
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 << ';');