将std::stringstream作为函数参数

3

我有一个 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>
        ]

有人能解释一下出了什么问题吗?


1
也许最好通过引用传递stringstream。 - Luca Martini
1个回答

4
如果你想从 std::stringstream 中调用 str 成员函数,并写下 return ss.str;,那么你漏掉了一对括号:
return ss.str();

此外,您的代码可能不会按照您的预期工作。如果您希望每次调用addup都在同一个std::stringstream实例上运行,则必须通过引用获取它:修改addup签名并在boost::bind中将ss参数周围添加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 << ';');

现在出现了一个问题,它说boost::bind不能将stringstream作为第三个参数传递,但是bind没有这样的重载? - Tony The Lion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接