2011-10-16 37 views
11

Đây có phải là mẫu hợp lệ trong các mẫu C++ không?Tham số mẫu mẫu trên hàm

template < template <typename T2> class T> 
void foo() { 

} 
+3

@ChrisLutz, tôi nghĩ rằng 'T2' là tùy chọn. – iammilind

+0

@ChrisLutz: Tôi nghĩ, không thực sự. http://ideone.com/8jlI5 – Nawaz

+0

@Nawaz - Tôi nhớ đọc ở đâu đó. Tôi dường như chỉ là sai lầm trên tất cả các nơi ngày hôm nay. Lỗi của tôi. –

Trả lời

13

Có. Nó hợp lệ.

Bạn có thể gọi chức năng này với bất kỳ mẫu lớp nào yêu cầu chính xác một thông số mẫu. Ví dụ,

template<typename T> 
struct A 
{ 
    //... 
}; 

foo<A>(); //ok 

Lưu ý rằng bạn không cần phải cung cấp các luận cứ mẫu cho A lớp mẫu, có nghĩa là, sau đây sẽ gây ra lỗi biên dịch:

foo< A<int> >(); //error 

Ngoài ra, trong mã của bạn T2 là tùy chọn, và trong thực tế, bạn không thể sử dụng nó trong các chức năng, vì vậy tốt hơn loại bỏ nó để làm cho định nghĩa đơn giản:

template < template <typename> class T> 
void foo() { 

    T<int> x; //this is how T can be instantiated; provide template argument! 
} 

Demo: http://ideone.com/8jlI5

+0

Giống như 'T2' trong trường hợp này, nó luôn luôn là tùy chọn? Tôi cũng không thể sử dụng nó trên các mẫu lớp. http://ideone.com/LEt6N – user103214

+0

@ user974191: Có. Nó không bao giờ được yêu cầu. Bạn không thể sử dụng nó trong định nghĩa mẫu! – Nawaz

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