2010-06-16 22 views
7

Mã này:Lớp mẫu tham chiếu đến chính nó dưới dạng tham số mẫu mẫu?

template <template <typename> class T> 
class A 
{ 
}; 

template <typename T> 
class B 
{ 
    A<B> x; 
}; 

không biên dịch, Tôi cho rằng kể từ khi A<B> được hiểu như là A<B<T> > trong phạm vi B 's.

Vì vậy, làm thế nào để bạn vượt qua B làm thông số mẫu mẫu trong phạm vi của nó?

+0

Không đơn giản chỉ định công việc sau đây? vì T có thể là bất kỳ loại đơn giản hoặc mẫu nào cũng ........... Mã _-------- mẫu lớp A { }; – Pardeep

+0

@Pardeep: Tôi không hoàn toàn theo bạn. 'A''s T là một đối số mẫu template. Nó rất khác với 'template lớp A {}'. – uj2

+0

Tại sao bạn có thể muốn? Tôi chưa bao giờ thấy bất kỳ việc sử dụng nào cho điều đó. – Puppy

Trả lời

12

Hãy thử điều này:

template <typename T> 
class B 
{ 
    A<::B> x; // fully qualified name for B 
}; 

Theo C++ chuẩn 14.6.1/2 bạn nên sử dụng tên thông thường của mẫu (ví dụ, tên khỏi phạm vi bao quanh, không phải là tiêm-class-name) .

+0

Cảm ơn. Điều đó đã làm điều đó. – uj2

+5

Đẹp nhất :) Đáng chú ý rằng không gian trước ':: B' là cần thiết, mặc dù :) –