2010-06-10 27 views
6

Vì vậy, tôi đang cố gắng lấy một số mã được viết cho gcc để biên dịch trên Visual Studio 2008. Tôi gặp sự cố mà tôi đã thu hẹp xuống đây:Tại sao khai báo lớp này không hoạt động trên Visual Studio

class value_t 
{ 
public: 
    typedef std::deque<value_t>   sequence_t; 
    typedef sequence_t::iterator  iterator; 
}; 

mã này thất bại:

1>cpptest.cpp 
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(13) : see reference to class template instantiation 'std::deque<_Ty>' being compiled 
1>  with 
1>  [ 
1>   _Ty=value_t 
1>  ] 
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t' 

Tuy nhiên khi tôi thử điều này với std :: vector, nó biên dịch tốt:

class value_t 
{ 
public: 
    typedef std::vector<value_t>  sequence_t; 
    typedef sequence_t::iterator  iterator; 
}; 

Wh có sai không? Tôi đã cố gắng thêm 'typename' ở khắp mọi nơi tôi có thể nghĩ đến, nhưng tại thời điểm này tôi nghĩ nó chỉ là một lỗi trong STL Dinkumware. Bất cứ ai có thể giải thích những gì đang xảy ra, và/hoặc cung cấp một giải pháp? Cảm ơn.

+1

Có "ở khắp mọi nơi bạn có thể nghĩ đến" bao gồm 'typedef typename sequence_t :: iterator iterator;'? – Stephen

+0

Bạn có thể thử khai báo trước trước khi khai báo lớp học. tức là giá trị class_t; –

+0

Điều này luôn xảy ra - ngay sau khi tôi đăng câu hỏi này, tôi tìm thấy sự kết hợp ma thuật trong google để cung cấp cho tôi thứ gì đó có liên quan. Xem http://www.gamedev.net/community/forums/topic.asp?topic_id=295828 thảo luận về chủ đề này; vẫn không cung cấp giải pháp. Ai đó có thể xác nhận rằng việc sử dụng deque trong tình huống này là không chuẩn? Có cách nào để làm việc này mà không thay đổi tệp ? – Roel

Trả lời

7

Hành vi không xác định của nó. Xem this liên kết trên ++ clc kiểm duyệt

Snip từ câu trả lời Daniel K: -.

tiêu chuẩn

C++ (cả C++ 03 và C++ 0x) nói rằng những gì bạn đang cố gắng nguyên nhân không xác định hành vi, xem [lib.res.on.functions]/2:

"Đặc biệt, hiệu ứng không xác định trong các trường hợp sau đây: [..] - nếu một loại không đầy đủ (3.9) là được sử dụng làm đối số mẫu khi khởi tạo một thành phần mẫu. "

+0

Cảm ơn bạn, chuỗi đó giải thích chi tiết nhất mà tôi có thể muốn. Đoán tôi sẽ phải thay đổi mã. – Roel

1

Bạn đang cố gắng sử dụng một lớp trong chính nó trong một mẫu. Nó giải quyết vấn đề này như thế nào? Tôi không biết rằng tôi đã bao giờ cố gắng làm điều này, nhưng điều này thậm chí có thể? Tôi không biết tại sao nó hoạt động cho std :: vector, nhưng giả định của tôi là nó là sai. Bạn đang định nghĩa một lớp và sử dụng định nghĩa đó trong định nghĩa. Có vẻ sai với tôi. Chúc may mắn về điều này, tôi sẽ được quan tâm để xem một số câu trả lời sâu sắc hơn bản thân mình ...

+0

Nó hoạt động cho std :: vector, và trên gcc mã này cũng biên dịch tốt. Tôi đoán miễn là sizeof (lớp) được biết là đủ rồi. Nó vấp lên những người trong liên kết tôi đăng trong bình luận quá, rõ ràng. Tôi đã làm điều này với vector trong nhiều năm - chỉ là một sự trùng hợp ngẫu nhiên mà nó đã làm việc sau đó, tôi đoán vậy. – Roel

5

Tôi nghĩ rằng là một loại không đầy đủ cho đến khi bạn kết thúc định nghĩa. Cố gắng sử dụng loại không đầy đủ vì thông số mẫu cho vùng chứa chuẩn không thực sự hoạt động. Nó có thể/sẽ xảy ra để làm việc trong một số trường hợp, nhưng nếu nó không thành công với tất cả các loại container tiêu chuẩn, mà vẫn sẽ không báo hiệu bất kỳ loại lỗi nào. Tiêu chuẩn yêu cầu nó phải là một loại hoàn chỉnh, vì vậy nếu không, bạn sẽ có được những gì bạn nhận được - có lẽ nên không nhất quán, nhưng nếu nó xảy ra, không có gì sai.

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