2013-08-22 33 views
34

Trong một file C++ header, tôi nhìn thấy mã này:C++ - ý nghĩa của một tuyên bố kết hợp typedef và typename

typedef typename _Mybase::value_type value_type; 

Bây giờ, như tôi hiểu, trích dẫn từ «C++ Complete Reference» theo Schildt . typename có thể được thay thế bằng lớp từ khóa, việc sử dụng thứ hai của typename là thông báo cho trình biên dịch rằng tên được sử dụng trong khai báo mẫu là tên loại chứ không phải tên đối tượng.

Tương tự, bạn có thể xác định tên loại dữ liệu mới bằng cách sử dụng từ khóa typedef. Bạn không phải là thực sự tạo loại dữ liệu mới, nhưng thay vì xác định tên mới cho loại hiện có.

Tuy nhiên, bạn có thể giải thích chính xác ý nghĩa của dòng mã trên không, trong đó typedeftypename được kết hợp với nhau. Và "::" trong tuyên bố ngụ ý là gì?

+1

'typename' có cùng sử dụng bên trong và bên ngoài' typedef'. Một ví dụ thực tế hơn (loại) có thể là 'typedef typename std :: vector :: iterator Iter;' – chris

+0

@chris chính xác những gì _Mybase :: value_type và value_type riêng biệt, và "_Mybase :: value_type value_type" đại diện? – Arvind

+5

Và omg, Schildt đã trở lại. Đốt cuốn sách đó ngay bây giờ. – chris

Trả lời

35

typedef đang xác định loại mới để sử dụng trong mã của bạn, như viết tắt.

typedef typename _MyBase::value_type value_type; 
value_type v; 
//use v 

typename ở đây là để cho trình biên dịch biết rằng value_type là một loại và không phải là một đối tượng bên trong _MyBase.

các :: là phạm vi của loại. Nó giống như "đang ở" vậy là value_type "nằm trong" _MyBase. hoặc cũng có thể được cho là có chứa.

+3

Có phải 'tên tệp' cần thiết ở đây không? – aakashbhowmick

+0

Điều đó tùy thuộc vào ngữ cảnh. Nếu _MyBase phụ thuộc vào một tham số mẫu hơn có (nếu _MyBase là một kiểu mẫu), nếu không bạn không cần phải làm như vậy. Nếu bạn đang bối rối về ngữ cảnh của bạn, trình biên dịch sẽ giúp bạn bằng cách đưa ra một lỗi. – pippin1289

1

typename có nghĩa là _Mybase::value_type là tên loại để typedef có thể dựa vào thực tế đó.

+6

Điều gì sẽ thay đổi nếu tôi không bao gồm? Nó không biên dịch, có một số cảnh báo bị thiếu? Tôi nghĩ typedef A B; hoạt động tốt trong mọi trường hợp. – masterxilo

+3

Sẽ rất tuyệt nếu ai đó có thể trả lời nhận xét của @ masterxilo vì tôi chỉ đang nghĩ như vậy. – RastaJedi

+1

@RastaJedi Trong Visual Studio ít nhất, 'typename' dường như không được yêu cầu trong trường hợp này. Nó thậm chí còn sai khi đặt nó trừ khi lớp bạn đang định nghĩa là templated: 'typedef int Int; mẫu struct B { \t typedef typename Int IInt; }; 'là tốt nhưng' typedef int Int; struct B { \t typedef typename Int IInt; }; 'thì không. – masterxilo

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