Tôi có một mẫu lớp được lồng trong một mẫu khác. Một phần chuyên nó là dễ dàng: Tôi chỉ cần khai báo một khối template< … >
bên trong cha mẹ của nó.chuyên mẫu thành viên mà không có chuyên môn của cha mẹ
Tuy nhiên, tôi cần một chuyên môn từng phần khác xảy ra để chỉ định tất cả các đối số mẫu cục bộ của nó. Điều này làm cho nó thành một chuyên môn rõ ràng. Chuyên môn rõ ràng, vì lý do gì, phải ở phạm vi không gian tên. Để khai báo nó bên ngoài lớp cha của nó, cha mẹ phải được chỉ định, yêu cầu danh sách đối số mẫu không trống. Điều này ngụ ý một phần chuyên môn hóa. Chuyên môn từng phần là những gì tôi đang làm và nó được cho là hoạt động ở phạm vi ngoài tùy ý. Nhưng cả GCC và Comeau đều không xác định tham số mẫu trong đề cử cha với các đối số chính thức chuyên môn hóa một phần.
template< class X > struct A {
template< class Y > struct B; // initial declaration OK
template< class Z >
struct B< A<Z> > {}; // partial OK as long as there's a local arg
template<> // ERROR: this syntax triggers explicit specialization
struct B<int> {};
};
template<> // ERROR: can't nest template<>s here (why?)
template< class X > // ERROR: can't deduce X from type of A<X>::B<int> (why?)
struct A<X>::B<int> {};
(tôi rời tất cả các mã không làm việc của tôi ở; nhận xét nó một cách thích hợp để cố gắng có ý nghĩa.)
Nhân tiện, bạn có thể làm việc xung quanh nó bằng cách thêm đối số giả, ví dụ: 'int' luôn là' 0'. Đây là lần đầu tiên tôi chơi với C++ 0x; Tôi đang cố gắng lặp qua một 'tuple'. Tôi đã thực hiện loại điều này trước đây, và nó gây phiền nhiễu rằng C++ 0x 'tuple' là ít mạnh hơn so với Boost ... lặp qua các đối số mẫu là chức năng hữu ích mà không nên là một nghi thức của đoạn văn. Ồ, và cho tất cả những rắc rối của tôi, GCC vẫn là ICE khi tôi sửa tất cả các lỗi. – Potatoswatter