có thể bằng cách nào đó làm cho một đặc điểm kỹ thuật mẫu một phần một lớp bạn bè không? I E. xem xét bạn có mẫu sau lớpMẫu C++: Thông số kỹ thuật một phần của mẫu và Lớp bạn bè
template <class T> class X{
T t;
};
Bây giờ bạn có chuyên ngành một phần, ví dụ, đối với con trỏ
template <class T> class X<T*>{
T* t;
};
Những gì tôi muốn đạt được là tất cả có thể X<T*>
là một lớp người bạn của X<S>
cho BẤT CỨ S
. I E. X<A*>
phải là bạn của X<B>
.
Tất nhiên, tôi nghĩ về một tuyên bố người bạn mẫu bình thường trong X:
template <class T> class X{
template <class S> friend class X<S*>;
}
Tuy nhiên, điều này không biên dịch, g ++ nói với tôi điều này:
test4.cpp: 34: 15: lỗi : chuyên môn hóa của 'template<class T> class X
' phải xuất hiện ở phạm vi không gian tên
test4.cpp: 34: 21: lỗi: một phần chuyên môn hóa 'X<S*>
' tuyên bố 'người bạn'
Điều này không thể thực hiện được hay có cách nào khác không?
Lý do tại sao tôi yêu cầu là tôi cần một constructor trong X<T*>
tạo ra lớp này từ một tùy X<S>
(S
phải là một subtype của T
).
Mã này trông như thế này:
template <class T> class X<T*>{
T* t;
template<class S>
X(X<S> x) : t(&(x.t)) {} //Error, x.t is private
}
Bây giờ, trình biên dịch phàn nàn, tất nhiên, đó không phải là x.t
visibile trong constructor vì nó là tư nhân. Đây là lý do tại sao tôi cần một lớp người bạn chuyên môn hóa một phần.
Chức năng 'get' có thực sự nằm ngoài câu hỏi không? Điều này có vẻ sạch hơn rất nhiều với tôi và tránh tất cả các bạn bè mẫu điên rồ. – pmr
nó sẽ làm việc trong ví dụ này có thể. Tuy nhiên, có thể có dữ liệu không được tiết lộ cho công chúng mà chỉ cho các chuyên môn về mẫu. Câu hỏi đặt ra là nếu hành vi này là có thể bằng cách nào đó. – gexicide