如何解决在容器之间传输数据时可能丢失的数据警告?

时间:2013-07-23 16:06:55

标签: c++

我正在尝试将数据从一个容器传输到另一个容器:

#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中收到三条C4244警告:“从'const int'转换为'const float',可能会丢失数据。”

现在我理解了警告,这是合法的警告。但是在我的特定情况下,数据丢失可以忽略不计。有没有办法承认警告而不必像这样做一个循环?

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

2 个答案:

答案 0 :(得分: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

答案 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()));