【问题标题】:How to address possible loss of data warning when transfering data between containers?在容器之间传输数据时如何解决可能的数据丢失警告?
【发布时间】:2013-07-23 16:06:55
【问题描述】:

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

#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));
}

【问题讨论】:

  • 我正在寻找一种方法来做到这一点没有循环和显式转换。
  • 我认为使用演员表进行“转换”会起作用 - 您需要演员表来转换类型而不会发出警告,因此您无法真正避免这种情况。 [除非您关闭警告,否则就是]。
  • std::transform(input_data.begin(), input_data.end(), std::back_inserter(output_data), [](int x) { return static_cast&lt;float&gt;(x); });。就像 Mats 说的那样,如果没有演员表,你就无法真正摆脱警告。对我来说,这看起来像是一个“选择你的毒药”场景。
  • 你确实需要一个明确的演员表。您可以使用 std::transform 代替循环,将强制转换作为操作,包装在 lambda 或自定义函数对象中。
  • 在 VS 中,您可以通过在报告问题的行上方使用 #pragma warning(suppress: 4244) 来消除警告。

标签: c++


【解决方案1】:

在 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

【讨论】:

  • 您想“推送”和“弹出”该警告,这样您以后才不会错过真正想要的警告。
  • @MatsPetersson 这样做(使用warning(suppress: 4244))只会抑制下一行的警告
  • 啊,好吧 - 那没关系。
  • 虽然这个答案是迄今为止最简单的,但在我的情况下使用 #pragma 不是一个选项。
  • @OlivierD 为什么不能使用#pragma(如果你不介意我问的话)?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    相关资源
    最近更新 更多