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 に「'const int' から 'const float' への変換、データが失われる可能性があります」という 3 つの C4244 警告が表示されます。

今、私は警告を理解しました。これは正当なものです。ただし、私の特定のケースでは、データの損失はごくわずかです。このようなループを実行せずに警告を確認する方法はありますか?

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

2 に答える 2

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ディレクティブを確認することをお勧めします。

于 2013-07-23T16:24:19.813 に答える
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()));
于 2013-07-23T16:30:58.487 に答える