2013-07-23 24 views
3

我試圖將數據從一個容器轉移到另一個:如何解決在容器間傳輸數據時可能發生的數據丟失警告?

#include <vector> 
int main() 
{ 
    std::vector<int> input_data; 
    std::vector<float> output_data; 

    output_data.insert(output_data.end(), input_data.begin(), input_data.end()); 
} 

在VS2005,我得到了base.hpp 3個C4244警告說:「從‘const int的’到‘常量浮動’的轉換,可能的損失數據的。」

現在我明白了這個警告,這是一個合法的警告。但在我的特殊情況下,數據的丟失是微不足道的。有沒有辦法承認警告,而不必像這樣做一個循環?

for (std::vector<int>::const_iterator it; it != input_data.end(); ++it) 
{ 
    output_data.push_back(static_cast<float32>(*it)); 
} 
+0

明確施放。 –

+0

我正在尋找一種方法來做到這一點_without_循環和顯式強制轉換。 – OlivierD

+1

我認爲「轉換」與演員陣營將會發揮作用 - 你需要一個強制轉換才能在沒有警告的情況下轉換類型,所以你不能真正避免這種情況。 [除非你關掉警告,那是]。 –

回答

1

使用boost::transform_iterator與現有的插件怎麼樣?

struct to_float { float operator()(int x) const { return static_cast<float>(x); }; 
output_data.insert(output_data.end(), boost::make_transform_iterator(input_data.begin(), to_float()), boost::make_transform_iterator(input_data.end(), to_float())); 
5

在Visual Studio中,你應該能夠通過使用#pragma指令繞過警告(這將會是完全有效的做到這一點,因爲大家都知道的警告,只是希望抑制它)舉例來說,你的主函數看起來是這樣的:

#include <vector> 
int main() 
{ 
    std::vector<int> input_data; 
    std::vector<float> output_data; 

#pragma warning(suppress: 4244) 
    output_data.insert(output_data.end(), input_data.begin(), input_data.end()); 
} 

這抑制警告C4244爲下面的代碼行(後續或前行仍然會發出的警告)。如果您想禁用更大塊代碼的警告排放,您可以查看其他#pragma warning directives

+0

你想「推」和「彈出」該警告,以便在以後真正需要時不會錯過。 –

+2

@MatsPetersson這樣做(使用'warning(suppress:4244)')只會抑制以下行的警告 –

+0

嗯,好的 - 這樣就可以了。 –

相關問題