下面是代码,
std::stringstream os;
for (size_t i = 0U; i < len; i++) {
os << static_cast<uint32_t>(src[i]);
}警告是:“咨询规则14-8-2,可行集包含功能和模板: std::basic_ostream::operator<<”。
对于下面的代码行
os << static_cast<uint32_t>(src[i]);请建议如何解决同样的问题,我对c++还是新手,肯定也是一样的。
发布于 2014-01-30 07:16:33
触发Misra警告是因为basic_ostream定义了一个成员operator<< (这是一组非模板重载)以及一组自由函数模板版本。正如警告所述,重载解决方案的候选集包括这些函数模板和非模板。
您的选项是要么取消对此行的警告,要么找出一种不使用operator<<执行格式化输出的方法。后者可以通过创建数字的中间字符串表示,然后使用basic_ostream::write输出字符来完成。如果您有一个C++11编译器,您可以使用std::to_string来完成这个任务。
auto s = std::to_string(42U);
std::stringstream ss;
ss.write(s.c_str(), s.size());如果您不能使用to_string,或者需要额外的格式设置,则始终存在用于创建字符串表示形式的s(n)printf。
我个人的观点是抑制这种警告,理由是您使用的是标准库中定义的、众所周知的类型。
发布于 2014-01-30 07:02:45
您使用的是一种非常通用的类型:std::std流。可能是
template<class charT, class traits, class T>
basic_ostream<charT,traits>& operator<< (basic_ostream<charT,traits>&& os, const T& val);而且还
ostream& operator<< (ostream& os, ...);发布于 2016-06-29 00:17:59
赫伯萨特有一篇伟大的文章,为什么这个规则是有意义的。它与C++标准处理模板和非模板函数之间过载分辨率的特定顺序有关。实际选择的函数可能并不总是遵循程序员的期望。下面是链接:http://www.gotw.ca/publications/mill17.htm
看来STL里面有一些比较危险的代码。
https://stackoverflow.com/questions/21449645
复制相似问题