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 << inputstd::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 回答