8

次のコードをコンパイルすると、コンパイラから警告が表示されます。

"Implicit conversion loses integer precision: 'std::streamsize' (aka 'long') to 'int'". 

精度の現在の値を保存して後で元の値に戻そうとするだけなので、この警告について少し混乱しています。

#include <iomanip>
#include <iostream>

int main() {
  std::streamsize prec = std::cout.precision();
  std::cout << std::setprecision(prec);
}

この場合、精度の値を保存して後で元に戻す正しい方法は何ですか?

4

1 に答える 1

11

標準仕様の単なる見落としのようです。

ios_base::precision1 つは精度を取得し、もう 1 つは精度を設定します。

// returns current precision
streamsize precision() const;

// sets current precision and returns old value
streamsize precision(streamsize prec) const;

したがって、このコードは警告を表示しません。

#include <iostream>

int main() {
  std::streamsize prec = std::cout.precision(); // gets
  std::cout.precision(prec); // sets
}

ただし、setprecision()関数は単純に古いものを使用しintます。

unspecified-type setprecision(int n);

未指定のファンクターを返します。ストリームによって消費されると、str次の効果があります。

str.precision(n);

あなたの場合、streamsizeintありません(そうである必要はありません)。したがって、警告です。setprecisionのパラメータが ではなくになるように、標準をおそらく変更する必要intがありstreamsizeます。

precison()上記のように自分自身を呼び出すか、十分であると仮定intしてキャストすることができます。

#include <iomanip>
#include <iostream>

int main() {
  std::streamsize prec = std::cout.precision();
  std::cout << std::setprecision(static_cast<int>(prec));
}

編集:どうやら修正するために提出され、コンセンサスに達しませんでした(非欠陥として閉じられました)

于 2012-07-27T23:19:46.060 に答える