2014-01-30 80 views
3

這裏是下面的代碼,MISRA C++ 2008陌生警告

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

警告是:「諮詢規則14-8-2,可行集合包含兩個功能 和模板:性病:: basic_ostream ::操作者< <「

用於以下的代碼行

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

請建議如何解決這個問題,我是新來的C++,並確定相同。

+0

消息中沒有更多信息?請修改您的問題以包含完整的信息。 –

+5

@Joachim完整的消息*包含在第一個代碼片段的下方。這是因爲['basic_ostream'](http://en.cppreference.com/w/cpp/io/basic_ostream)定義了一個成員'operator <<',這是一組愚蠢的Misra規則,非模板重載以及一組免費函數模板版本。正如警告所述,重載解析的候選集合包含這兩個函數模板和非模板。 – Praetorian

+3

...這是隻有很多原因不使用米斯拉C++編碼標準。它有一套相當可恥的規則。 –

回答

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, ...); 
3

被觸發的米斯拉警告,因爲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創建的字符串表示。

我的個人意見是要壓制這個警告,理由是您使用的是標準庫中定義明確且廣爲人知的類型。

0

香草薩特有一篇關於爲什麼這個規則有意義的偉大文章。它與C++標準處理模板和非模板函數之間的重載分辨率的特定順序有關。所選擇的實際功能可能並不總是符合程序員的期望。這裏是鏈接: http://www.gotw.ca/publications/mill17.htm

似乎STL有一些輕度危險的代碼在那裏。