以下是代码,
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 ++的新手并且确定也一样。
答案 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在那里有一些有点危险的代码。