MISRA C ++ 2008奇怪警告

时间:2014-01-30 06:48:14

标签: c++

以下是代码,

std::stringstream os;
for (size_t i = 0U; i < len; i++) {
    os << static_cast<uint32_t>(src[i]);
}
  

警告是:“咨询规则14-8-2,Viable集包含两个功能   和模板:std :: basic_ostream :: operator&lt;&lt;“

以下代码行

os << static_cast<uint32_t>(src[i]);

请建议如何解决这个问题,我是c ++的新手并且确定也一样。

3 个答案:

答案 0 :(得分:3)

正在触发Misra警告,因为basic_ostream定义了一个成员operator<<,这是一组非模板重载,还有一组free function template版本。正如警告所说,重载决策的候选集包括这两者 - 功能模板和非模板。

您可以选择禁止此行的警告,或者找出不使用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来创建字符串表示形式。

我个人的意见是压制这种警告,理由是您使用标准库中明确定义且众所周知的类型。

答案 1 :(得分:0)

您使用的是非常通用的类型:std :: stringstream。可能是

template<class charT, class traits, class T>
basic_ostream<charT,traits>& operator<< (basic_ostream<charT,traits>&& os, const T& val);

以及

ostream& operator<< (ostream& os, ...);

答案 2 :(得分:0)

Herb Sutter有一篇很棒的文章,讲述为什么这条规则有意义。它与C ++标准处理模板和非模板函数之间的重载分辨率的特定顺序有关。所选择的实际功能可能并不总是遵循程序员的期望。链接在这里: http://www.gotw.ca/publications/mill17.htm

似乎STL在那里有一些有点危险的代码。