私は古いコードで警告を取り除こうとしていましたが(MSVC 2005を使用しなければならず、現在は32ビットビルドで動作しています)、苦労してsize_t
〜unsigned int
変換警告を取り除いてください。私たちは、型パラメータとして "size_t"、キャスト警告が再生されない
template<typename I> const T& at(const I i) const {return atImpl(i);}
メソッドを実装して成長している配列の私たち自身のArray<T>
の実装を持っています。
size_t i = 10; myArray.at(i);
として呼び出されたときに、私はconversion from 'size_t' to 'const unsigned int', possible loss of data
警告が表示されます。 作業理論はI
を変換/ size_t
(不便なく、許容されているだろう)at
からi
を渡すときunsigned int
へをキャストするようにコンパイラを引き起こしているunsigned int
、であると理解されていることをてきました。しかし、は最小限の作業例(この記事の最後)でも、より複雑な最小限の例でもこの警告を再現できませんでした。単にunsigned int
にパラメータをキャストすると、警告が消えなり、私たちのニーズに十分であろう(契約によって、数はunsigned int
に収まる)
- 私の理解は約
I
unsigned int
ているように、コールで正しい(仕様では、「言いますのtypedef名は、このように別のタイプの同義語です。typedefは名 は、新しいタイプ」を導入しない、typeid(size_t(1)).name()
)がunsigned int
とsize_t
はtypedef
供給されているようだと言います。言い換えれば、最小限の例で警告を与えるべきか、そうすべきではないか?私が知る限り、構築構成は同じです。 - 私たちのコードは私たちに警告を与えており、最小限の例ではないので、私は見落とされるべきものがあります。すべての努力にもかかわらず、私は何が分かりません。アイデア?
おかげ
最小限例
: 機能でtemplate<typename T>
class A
{
int t;
public:
template<typename I> T& at(const I i) { return t;}
};
int main()
{
size_t i = 10;
A<int> a;
a.at(i) = 5; // no warning, why?
return 0;
}
'/ Wp64'が有効になっていますか? –
万が一 '/ Wp64'オプションを使用していますか? 'size_t'は64ビットモードではサイズが違うと警告しますが、' unsigned int'はそうではありません。 –
コードを移植性を持たせることに取り組んでいるなら、警告の意味を考えるのではなく、あなたの 'MyVector'型で' std :: size_t'を使うことを検討してください。ある日、または別のあなたがアーキテクチャー(64ビット)を変更し、 'size_t'は異なるサイズであるかもしれないし、あなたがカムバックを持っており、すべての警告を再訪します... ない限り、当然のことながら、引数がコンテナにアクセスするために使用されていませんが、他の形式で保存する。 –