2013-06-16 31 views
5

Tôi đang gặp sự cố khi chuyên về mẫu bên trong khi tất cả thông số đều được biết. Dưới đây là ví dụ:Chuyên mẫu bên trong với các thông số mặc định

template < typename T0 > 
struct outer 
{ 
    template < typename T1 = void, typename T2 = void > 
    struct inner 
    { 
     typedef T1 type; 
    }; 
}; 
template < typename T0 > 
template < typename T1 > 
struct outer<T0>::inner<double,T1> { typedef int type; }; 

Điều này chỉ hoạt động tốt. Nếu tôi thay vì chỉ định mẫu bên trong như vậy, nó không:

template < typename T0 > 
template < > 
struct outer<T0>::inner<double,void> { typedef int type; }; 

Đối với điều này tôi nhận được thông báo lỗi, "chuyên môn hóa rõ ràng không hợp lệ trước '>' dấu hiệu ... kèm theo mẫu lớp không rõ ràng chuyên ngành .. .template tham số không được sử dụng trong chuyên môn hóa một phần: ... T0 ". Không chắc chắn WTAF đang diễn ra ở đây.

Tôi cũng đã cố gắng này:

template < typename T0 > 
struct outer<T0>::inner<double,void> { typedef int type; }; 

tôi mong đợi này thất bại và được thông báo lỗi là không đáng ngạc nhiên. Đó là: "quá ít mẫu tham số-danh sách".

Vì vậy, cách chính xác để làm điều này là gì? Tôi có thể tất nhiên hack xung quanh nó, nhưng nếu tôi không phải tôi không thích.

+0

liên quan: http://stackoverflow.com/questions/9219157/why-cant-i-specialize-the-nested-template lq = 1 –

+0

Hmm ... Tôi đã thực hiện tìm kiếm nhưng điều đó không hiển thị. Phải không hy sinh đúng loài dê trước khi làm như vậy. –

Trả lời

7

Điều đó không được phép. Bạn không thể hoàn toàn chuyên môn hóa một thành viên của một mẫu lớp mà bản thân nó không hoàn toàn chuyên biệt.

mỗi đoạn 14.7.16 của C++ 11 Tiêu chuẩn:

Trong một tuyên bố chuyên môn hóa rõ ràng cho một thành viên của một lớp mẫu hay một khuôn mẫu thành viên xuất hiện trong phạm vi không gian tên, mẫu thành viên và một số mẫu lớp kèm theo của nó có thể vẫn là không được chuyên môn hóa, ngoại trừ việc khai báo sẽ không chuyên biệt một cách rõ ràng mẫu thành viên lớp nếu các mẫu lớp kèm theo không rõ ràng là. [...]

Ngoài ra, đoạn 14.7.3/15 của C++ 11 Chuẩn nói:

Một thành viên hoặc một mẫu thành viên có thể được lồng vào nhau trong nhiều lớp mẫu kèm theo. Trong một chuyên môn rõ ràng cho một thành viên như vậy, khai báo thành viên sẽ được bắt đầu bằng template<> cho mỗi mẫu lớp kèm theo chuyên biệt một cách rõ ràng. [Ví dụ:

template<class T1> class A { 
    template<class T2> class B { 
     void mf(); 
    }; 
}; 
template<> template<> class A<int>::B<double>; 
template<> template<> void A<char>::B<char>::mf(); 

- cuối dụ]

+0

Nó không phải là một chức năng thành viên, nhưng tôi cho rằng cùng một quy tắc áp dụng cho các loại lồng nhau? –

+0

Giả sử Nate là chính xác. Bạn có thể trích dẫn chương/câu không? 03 là tốt hơn, nhưng 11 sẽ làm. –

+1

@CrazyEddie: Có, tôi đang tìm kiếm báo giá –