【问题标题】:std::stringstream as parameter to a functionstd::stringstream 作为函数的参数
【发布时间】:2010-12-15 08:21:42
【问题描述】:

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

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

【问题讨论】:

  • 通过引用传递stringstream 可能会更好。

标签: c++ stringstream boost-bind


【解决方案1】:

如果通过编写return ss.str;,您打算从std::stringstream 调用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 作为参数 3,bind 没有这样的重载???
猜你喜欢
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多