2012-07-05 34 views
9

Tôi đã tìm kiếm một thứ khác liên quan đến thông số mẫu mẫu và xảy ra khi this answer xác nhận rằng thông số mẫu của mẫu mẫu là không phải là được phép theo tiêu chuẩn.Các tham số mẫu của mẫu template có phải là phần mở rộng hoặc một phần của tiêu chuẩn không?

Tuy nhiên, đoạn mã sau biên dịch trong vang mới nhất (3.2) và GCC mới nhất (4.8):

template<template<template<typename> class> class T> struct test {}; 
template<template<typename> class T> struct foo {}; 
test<foo> bar; 

Đây có phải là một phần mở rộng, hoặc là câu trả lời khác thực sự không chính xác và nó được cho phép bởi Tiêu chuẩn? Nếu không, có lý do cụ thể nào cho sự thiếu sót không?

+0

@chris OP có thể là ảnh chụp nhanh 4.8. Tôi đã sử dụng một thời gian. – juanchopanza

+0

Vâng, tôi có ảnh chụp nhanh từ MacPorts ... vì vậy, có lẽ không phải là svn mới nhất hoặc bất cứ điều gì như thế. – celticminstrel

+0

nó cũng biên dịch trên gcc 4.5 trên Ideone http://ideone.com/BUAuw – TemplateRex

Trả lời

8

Trong std::vector<int> mẫu lớp std::vector được chuyển thành loại tham số int. Trong std::get<42>(some_tuple), mẫu chức năng std::get được chuyển giá trị 42 làm tham số. Có lẽ unimaginatively các loại cũ của đối số được gọi là một loại đối số của một mẫu (hoặc mẫu kiểu đối số) trong khi loại thứ hai là một (mẫu) không kiểu đối số.

Nhưng mẫu cũng có thể chấp nhận một loại đối số khác: các mẫu khác. Ví dụ: template<template<typename> class T> void foo(); tuyên bố mẫu chức năng lấy mẫu làm đối số, chính nó lấy đối số kiểu. (Như một lưu ý, trong khi các mẫu không phải là loại thuật ngữ 'đối số không kiểu' vẫn không bao gồm các đối số mẫu khuôn mẫu. Nó được dành riêng cho các đối số như template<int NonTypeArgument>.)

Vì không có mẫu nào như mẫu mẫu trong C++ (có các mẫu lớp, hàm và bí danh - nhưng chúng chỉ đơn giản là 'mẫu'), không có thứ gì như tham số mẫu của mẫu template. Những gì bạn có là chạy ra khỏi tham số mẫu mẫu nhà máy, trong đó đối số mẫu dự kiến ​​có chính đối số mẫu khuôn mẫu. Tôi không thể tìm thấy tham chiếu trong Tiêu chuẩn cấm điều này, như câu trả lời bạn liên kết xác nhận quyền sở hữu.

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