Hãy nói rằng tôi là tạo ra một lớp học cho một cây nhị phân, BT
, và tôi có một lớp học trong đó mô tả một yếu tố của cây, BE
, một cái gì đó giống nhưMẫu lớp với bạn bè lớp mẫu, những gì đang thực sự xảy ra ở đây?
template<class T> class BE {
T *data;
BE *l, *r;
public:
...
template<class U> friend class BT;
};
template<class T> class BT {
BE<T> *root;
public:
...
private:
...
};
Điều này dường như làm việc; tuy nhiên tôi có câu hỏi về những gì đang xảy ra bên dưới.
tôi ban đầu đã cố gắng để tuyên bố những người bạn như
template<class T> friend class BT;
tuy nhiên nó xuất hiện cần thiết để sử dụng U
(hoặc một cái gì đó khác hơn T
) ở đây, tại sao điều này? Có phải ngụ ý rằng bất kỳ BT
cụ thể nào là bạn của bất kỳ lớp học cụ thể BE
nào không?
Trang IBM trên mẫu và bạn bè có ví dụ về các loại quan hệ bạn bè khác nhau cho các chức năng chứ không phải các lớp (và đoán một cú pháp chưa hội tụ trên giải pháp). Tôi muốn hiểu làm thế nào để có được các thông số kỹ thuật chính xác cho các loại mối quan hệ bạn bè tôi muốn xác định.
xây dựng này trong mã bạn lớp tôi BT ném một lỗi cho dòng người bạn lỗi : 'BT' không phải là mẫu ngay cả khi được khai báo sau là mẫu lớp BT { ... } –
Vì vậy, bí mật là tôi cần phải chuyển tiếp khai báo BT để sử dụng lớp bạn bè BT; dòng trong BE, nhưng không cho mẫu lớp người bạn BT ;. Cảm ơn đã giúp đỡ! –
Để cụ thể hơn: bạn phải chuyển tiếp khai báo 'mẫu lớp BT;' _before_ định nghĩa BE, và sau đó sử dụng 'lớp người bạn BT ;' _inside_ lớp BE. –