3

私はを持っていて、std::vector<std::string> temp_resultsstd :: 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>
        ]

誰かが何が悪いのか説明してもらえますか?

4

1 に答える 1

4

を書くことによって、からメンバー関数return ss.str;を呼び出すつもりである場合、括弧のペアが欠落しています:strstd::stringstream

return ss.str();

また、あなたのコードはおそらくあなたが期待することをしないでしょう。すべての呼び出しをaddup同じstd::stringstreamインスタンスで機能させる場合は、参照によってそれを取得する必要があります。署名を変更し、のパラメータの周りにアラウンドaddupを追加します。boost::ref()ssboost::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 << ';');
于 2010-12-15T08:25:44.350 に答える