std::stringstream как параметр функции

У меня есть 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>
        ]

Может кто-нибудь объяснить, что не так?


person Tony The Lion    schedule 15.12.2010    source источник
comment
Может быть, будет лучше, если вы передадите stringstream по ссылке.   -  person Luca Martini    schedule 15.12.2010


Ответы (1)


Если, написав return ss.str;, вы намереваетесь вызвать функцию-член str из std::stringstream, то вам не хватает пары скобок:

return ss.str();

Кроме того, ваш код, вероятно, не будет делать то, что вы ожидаете. Если вы хотите, чтобы каждый вызов addup работал с одним и тем же экземпляром std::stringstream, вы должны использовать его по ссылке: измените подпись addup и добавьте boost::ref() вокруг параметра ss в файле boost::bind.

Вот рабочая версия, которая, я полагаю, делает то, что вы ожидаете:

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 << ';');
person icecrime    schedule 15.12.2010
comment
это исправлено, однако теперь он говорит, что boost::bind не может принимать stringstream в качестве параметра 3, такой перегрузки для bind нет??? - person Tony The Lion; 15.12.2010