我在标记的行中遇到以下编译错误:
错误:从“
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();
}
};
答案 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