2

マークされた行に次のコンパイルエラーが発生します。

エラー:'<code> std :: basic_ostream <char、std ::char_traits<char>>'から非スカラータイプ'<code>std::ostringstream'への変換が要求されました

私の例を修正するのを手伝ってもらえますか?

#include <numeric>
#include <sstream>

using namespace std;

ostringstream ConvertLettersToNumbers(ostringstream acc, char input)
{
    if(isdigit(input))
    {
        return acc << input; // error
    }
    else
    {
        return acc << static_cast<int>(input); // error
    }
};

int main(int argc, char **argv)
{
    string stringToCovert = "ABC";

    ostringstream out = accumulate(stringToCovert.begin(), stringToCovert.end(),     
         string(), ConvertLettersToNumbers);

    string convertedString = out.str(); // expected "656667"

    return 0;
}

編集:動作するが遅い文字列を使用した私の最初のバージョン:

   string ConvertLettersToNumbers(string acc, char input)
    {
        if(isdigit(input))
        {
            return acc + input;
        }
        else
        {
            stringstream sstr;
            sstr << static_cast<int>(input);
            return acc + sstr.str();
        }
    };
4

2 に答える 2

2

の結果はacc << inputですstd::ostream&。元のストリームの具体的なタイプが失われます。あなたはキャストでそれを修正することができます:

return static_cast<std::ostringstream&>(acc << input);

これが頻繁に発生する場合は、さまざまなテンプレートのヘルパーを想像できます。

return covariant_stream(acc, input, input2, "separator", input3);

コードには他にも多くのエラーがあるため、修正されたスケルトンは次のとおりです。

#include <ostream>
#include <sstream>

#define using abusing

std::ostringstream & ConvertLettersToNumbers(std::ostringstream & acc, char input)
{
    return static_cast<std::ostringstream&>(acc << input);
}
于 2012-08-15T13:51:55.290 に答える
1

別のアルゴリズムを使用してください。要素を一緒に追加するのではなく(つまり、そのaccumulateために)、transformシーケンスを別の種類のシーケンスに追加します。

このアプローチを検討してください。

int ConvertLetterToNumber(char input)
{
    if(std::isdigit(input))
    {
        return input - '0';
    }
    else
    {
        return input;
    }
};

int main(int argc, char **argv)
{
    std::string stringToConvert = "ABC";
    std::ostringstream stream;
    std::transform(stringToConvert.begin(),
            stringToConvert.end(),
            std::ostream_iterator<int>(stream),
            ConvertLetterToNumber);

    std::string convertedString = stream.str();

    return 0;
}

実用的なサンプルについては、こちらをご覧ください

于 2012-08-15T14:40:26.687 に答える