accumulate和ostringstream编译错误

时间:2012-08-15 13:50:18

标签: c++

我在标记的行中遇到以下编译错误:

  

错误:从“std::basic_ostream<char, std::char_traits<char> >”转换为非标量类型“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();
        }
    };

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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;
}

有关工作样本,请参阅here