首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MISRA C++ 2008奇怪警告

MISRA C++ 2008奇怪警告
EN

Stack Overflow用户
提问于 2014-01-30 06:48:14
回答 3查看 663关注 0票数 3

下面是代码,

代码语言:javascript
复制
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<<”。

对于下面的代码行

代码语言:javascript
复制
os << static_cast<uint32_t>(src[i]);

请建议如何解决同样的问题,我对c++还是新手,肯定也是一样的。

EN

回答 3

Stack Overflow用户

发布于 2014-01-30 07:16:33

触发Misra警告是因为basic_ostream定义了一个成员operator<< (这是一组非模板重载)以及一组自由函数模板版本。正如警告所述,重载解决方案的候选集包括这些函数模板和非模板。

您的选项是要么取消对此行的警告,要么找出一种不使用operator<<执行格式化输出的方法。后者可以通过创建数字的中间字符串表示,然后使用basic_ostream::write输出字符来完成。如果您有一个C++11编译器,您可以使用std::to_string来完成这个任务。

代码语言:javascript
复制
auto s = std::to_string(42U);
std::stringstream ss;

ss.write(s.c_str(), s.size());

如果您不能使用to_string,或者需要额外的格式设置,则始终存在用于创建字符串表示形式的s(n)printf

我个人的观点是抑制这种警告,理由是您使用的是标准库中定义的、众所周知的类型。

票数 3
EN

Stack Overflow用户

发布于 2014-01-30 07:02:45

您使用的是一种非常通用的类型:std::std流。可能是

代码语言:javascript
复制
template<class charT, class traits, class T>
basic_ostream<charT,traits>& operator<< (basic_ostream<charT,traits>&& os, const T& val);

而且还

代码语言:javascript
复制
ostream& operator<< (ostream& os, ...);
票数 0
EN

Stack Overflow用户

发布于 2016-06-29 00:17:59

赫伯萨特有一篇伟大的文章,为什么这个规则是有意义的。它与C++标准处理模板和非模板函数之间过载分辨率的特定顺序有关。实际选择的函数可能并不总是遵循程序员的期望。下面是链接:http://www.gotw.ca/publications/mill17.htm

看来STL里面有一些比较危险的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21449645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档