std :: stringstream как параметр функции - PullRequest
3 голосов
/ 15 декабря 2010

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

4 голосов
/ 15 декабря 2010

Если при написании 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 << ';');
...