2010-09-17 31 views
9

Tôi sẽ biết nếu chúng ta có thể tạo một lớp chuyên biệt một phần như một lớp bạn bè.làm thế nào để khai báo một lớp mẫu với tư cách một người bạn trong C++

template< class A, class B > 
class AB{}; 

class C; 

template < class B > 
class AB< C, B >{}; 

class D{ 
    template< class E > friend class AB< D, E >; 
} 

Cách đạt được điều này.

+3

Câu hỏi của bạn không rõ ràng: không có chuyên môn hóa một phần trong mã của bạn và bạn đã sử dụng lại tên lớp làm tên đối số mẫu, làm cho nó không rõ ràng những gì bạn định đề cập đến. –

+3

Cú pháp của bạn về chuyên môn từng phần đó là sai ... Bạn có biết cách viết chuyên môn từng phần không? Không có hành vi phạm tội, nhưng nó có vẻ như một trong những câu hỏi mà ai đó đã đọc một cái gì đó trên internet về bạn bè và chuyên môn một phần và sau đó nhanh chóng nhảy đến SO để thử và nhận được một số danh tiếng. –

Trả lời

8

này không được phép bởi C++ Standard (§14.5.3/9):

tờ khai bạn bè sẽ không khai báo chuyên ngành phần. [Ví dụ:

template<class T> class A { }; 
class X { 
    template <class T> friend class A<T*>; //error 
}; 

--end dụ]

Vì vậy, về cơ bản, bạn có thể làm cho tất cả sự khởi tạo của AB người bạn của D hoặc chỉ có một instantiation cụ thể. This IBM page mô tả các mối quan hệ khác nhau có thể đạt được khi nói đến bạn bè và các mẫu: "một-một", "một-nhiều", "nhiều người" và "nhiều người" (nhưng không phải "một-một-số" như bạn đã hỏi).

+0

Làm thế nào để thực hiện tất cả các instantiations của 'AB' người bạn của' D'? – balki

+0

@balki: 'lớp D {template lớp người bạn AB; }; ' –

1

xem câu trả lời here, nhờ Drew Dormann

template <class T, class C> 
class proxy { 
    friend C; 

Nó làm việc cho tôi.

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