2011-11-17 29 views
7

Vì một số lý do, khi tôi xác định một biến là "uint" thay vì "unsigned int" trong chương trình của tôi, lỗi đó. Điều này có vẻ lạ, bởi vì uint được nhập là:Sử dụng lỗi nhập liệu gây ra lỗi, trong khi "unsigned int" không ...?

typedef unsigned int uint; 

... vì vậy tôi nghĩ rằng tôi có thể sử dụng hai thay thế cho nhau. Để chính xác hơn, tôi chỉ định kết quả của hàm trả về "unsigned int" thành biến uint, sau đó sử dụng uint đó trong cuộc gọi thay đổi kích thước vectơ ... tại thời điểm lỗi đó. Tức là, mã của tôi trông giống như sau:

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; 
} 

... và dòng nó sai là dòng myVect.resize.

Rõ ràng, tôi đã có một giải pháp, nhưng tôi muốn hiểu TẠI SAO điều này đang xảy ra, vì tôi khá bối rối. Ai có ý tưởng gì không?

PS - Trong trường hợp bất kỳ ai nghĩ rằng điều đó có thể quan trọng, tôi đang sử dụng gcc v4.1.2 trên fedora 15 ... và tệp bao gồm định nghĩa uint là /usr/include/sys/types.h.

+9

Bất cứ khi nào bạn gặp lỗi, bạn luôn cần bao gồm lỗi được đề cập trong câu hỏi của mình. –

+1

Bạn nên hiển thị mã thực không thành công. Cụ thể là '# include'-s, khai báo' sử dụng', v.v. Và GCC 4.6 có lẽ phù hợp tiêu chuẩn hơn 4.1. –

+0

Và [như bạn có thể thấy ở đây] (http://ideone.com/Y1DRP), lỗi không xảy ra trong ví dụ bạn đã cung cấp (ít nhất là với phiên bản gcc đó). –

Trả lời

6

tôi đoán là có một uint trong hệ thống. Hãy thử đổi tên của bạn thành một cái gì đó bất thường hoặc thậm chí tốt hơn quấn nó trong một không gian tên.

namespace MY { 
    typedef unsigned int uint; 
} 

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

chỉ cần chọn câu trả lời này vì đó là một phỏng đoán tốt và tôi chưa bao giờ tìm ra chính xác những gì đang xảy ra ... –

-1

Tôi đoán là nó đang cố gắng tạo thành "phân cấp" của một số loại.

Nói cách khác, chúng ta có:

typedef unsigned int size_t; 
typedef unsigned int uint; 

Nếu size_t là "cụ thể hơn" so với một generic unsigned int, sau đó nó làm cho tinh thần để ngăn chặn nó được chuyển đổi sang uint, đó có thể là "cụ thể hơn" hơn bất kỳ unsigned int cũ nào.

Tôi mong chờ điều này là một cảnh báo nếu bất cứ điều gì, tuy nhiên, không phải là một lỗi ...

+3

Tôi không nghĩ vậy. Một 'typedef' tạo ra một bí danh cho một loại, không phải là một kiểu mới. Vì vậy, với các khai báo trên, 'unsigned int',' size_t', và 'uint' là tất cả cùng một kiểu (như là' unsigned' và 'int unsigned'). –

+0

@KeithThompson: Đó là những gì * nên * xảy ra, tôi đồng ý; Tôi đoán có lẽ trình biên dịch đã vô tình làm điều này thay vào đó, nhưng idk. – Mehrdad

Các vấn đề liên quan