2010-12-26 42 views
11

thể trùng lặp:
Use 'class' or 'typename' for template parameters?Sự khác biệt giữa "mẫu <class T>" và "mẫu <typename T>" là gì?

tôi thấy hai tờ khai mẫu lớp khác nhau:

template <class T> class SampleClass1 
{ 
    // ... 
}; 

template <typename T> class SampleClass2 
{ 
    // ... 
}; 

Sự khác biệt giữa hai mã này là gì?

EDIT: Tôi đã sửa sai từ khóa "typedef" thành "typename".

+5

sự khác biệt là điều đầu tiên là chính xác, trong khi điều thứ hai là không chính xác. Sử dụng 'typename' thay vì' typedef' trong lần thứ hai, sau đó sẽ không có sự khác biệt! – Nawaz

+4

@Nawaz: Vâng, xin lỗi vì từ khóa sai. Cập nhật – hkBattousai

Trả lời

17

Nếu bởi

template <typedef T> class SampleClass2 

bạn có nghĩa là

template <typename T> class SampleClass2 

thì không có sự khác biệt. Việc sử dụng classtypename (trong ngữ cảnh của tham số mẫu tham chiếu đến loại) có thể hoán đổi cho nhau.

Lý do cả hai từ khóa được phép ở đây là lịch sử. Xem this article để biết giải thích chi tiết.

14

Trong trường hợp của mẫu template paramater

template <typename T, template <typename> class Wrapper> 
class Foo { 
    //... 
    private: 
    Wrapper<T> data; 
}; 

Bạn phải sử dụng lớp trước classname. này là sai:

template <typename T, template <typename> typename Wrapper> 

nhưng điều này là ok:

template <typename T, template <class> class Wrapper> 

Trong trường hợp khác họ hoán đổi cho nhau.

+0

: có một đề xuất mới trong nhóm chuẩn hóa C++ loại bỏ sự khác biệt này. N4051: Cho phép tên tệp trong tham số mẫu mẫu — Richard Smith –

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