2011-11-17 12 views
7

何らかの理由で、私のプログラムで "unsigned int"の代わりに "uint"として変数を定義すると、エラーになります。typedefされたuintを使用するとエラーが発生しますが、 "unsigned int"はエラーになります...?

typedef unsigned int uint; 

ので、私は、交換可能に2を使用することができることを思うだろう...:UINTは次のようにtypedefされているので、これは、奇妙に思えます。より正確に言えば、 "unsigned int"を返す関数の結果をuint変数に代入すると、 ベクトルサイズ変更呼び出しでそのuintを使用しています...その時点ではエラーとなります。つまり、コードは次のようになります。

unsigned int getUInt() 
{ 
    return 3; 
} 

int main(void) { 
    vector<vector<float> > vectVect(100000); 
    for(uint i = 0; i < vectVect.size(); ++i) 
    { 
     vector<float>& myVect = vectVect[i]; 
     uint myUnsignedInt = getUInt(); 
     myVect.resize(myUnsignedInt); 
    } 
    cout << "finished" << endl; 
} 

...そして、その行のエラーはmyVect.resize行です。

明らかに、私はすでに解決策を持っていますが、私はかなり困惑しているので、これがなぜ起こっているのかを理解したいと思います。誰でもアイデアはありますか?

PS - 誰かが問題と思われる場合は、fedora 15でgcc v4.1.2を使用しています...そして、uintを定義するインクルードファイルは/usr/include/sys/types.hです。

+9

エラーが発生した場合は、常に問題の質問に質問を含める必要があります。 –

+1

実際のコードは失敗しているはずです。特に '#include'、' using'宣言などです.GCC 4.6は、おそらく4.1よりもはるかに標準に準拠しています。 –

+0

[ここからわかるように](http://ideone.com/Y1DRP)、提供された例でエラーは発生しません(少なくともgccのバージョンでは)。 –

答えて

6

私の推測では、システム内の別のUINTがあるということです。珍しいものにあなたの名前を変更してみてください。

namespace MY { 
    typedef unsigned int uint; 
} 

for (MY::uint i = 0; .... 
+2

ちょうど答えとしてこれを選ぶつもりです、それは良い推測だったので、何が起こっているのか正確には分かりませんでした... –

-1

私の推測では、それはある種の「階層」を形成しようとしているということです。言い換えれば

、我々は持っている:一般的なunsigned intよりも「より具体的」である

typedef unsigned int size_t; 
typedef unsigned int uint; 

size_t場合、それは「より具体的」とすることができる、uintに変換されるのを防ぐために理にかなっています任意の古いunsigned intより。何でも、しかし、ない場合にエラー

私はこれは警告であることを期待する...

+3

それはそれだとは思わない。 'typedef'は新しい型ではなく型のエイリアスを作成します。だから、上記の宣言で 'unsigned int'、' size_t'、 'uint'はすべて同じ型です(' unsigned'と 'int unsigned'と同じです)。 –

+0

@KeithThompson:それは*起こらなければならないことです、私は同意します。私はおそらく、コンパイラが誤ってこの代わりに、idkをしていたと思います。 – Mehrdad

関連する問題