2011-11-17 89 views
7

由于某些原因,当我在程序中将变量定义为“uint”而不是“unsigned int”时,它会出错。这看起来很奇怪,因为uint是typedef'd:使用typedef'd uint会导致错误,而“unsigned int”不会...?

typedef unsigned int uint; 

...所以我想我可以使用这两个可以互换。更确切地说,我将一个返回“unsigned int”的函数的结果赋值给一个uint变量,然后使用该uint在一个向量resize调用中调用......在这一点上它的错误。也就是说,我的代码看起来像这样:

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'-s,'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

我的猜测是它试图形成某种“层次结构”。

换句话说,我们有:

typedef unsigned int size_t; 
typedef unsigned int uint; 

如果size_t是比一般的unsigned int“更具体的”,则是有意义的防止它被转换为uint,这可能是“更具体的”比任何旧的unsigned int

我希望这是一个警告,如果有的话,虽然,不是一个错误......

+3

我不认为就是这样。 'typedef'为类型创建别名,而不是新类型。因此,鉴于上述声明,'unsigned int','size_t'和'uint'都是相同的类型(和'unsigned'和'int unsigned'一样)。 –

+0

@KeithThompson:这就是*应该发生的事,我同意;我猜可能是编译器意外地这样做,而是idk。 – Mehrdad

相关问题