Hem sınıf hem de bu sınıftaki bir yöntemin adını alan bir şablon sınıfı yazıyorum. Bunu yapmak zorundayım çünkü şablonumu başlatmak için kullanacağım çeşitli sınıflar, yöntemin adının sınıftan sınıfa değiştiği ortak bir imzayla benzer yöntemlere sahip. Bazı durumlarda söz konusu yöntem özeldir. Bu nedenle, şablonumun özel yönteme erişimini sağlayan bir arkadaş beyanı ile bu tür sınıfları arttırmak istiyorum.Arkadaş canlısı şablonum, kendi özel üyemden kendi ifadesinden bahsedebilir mi?
template<class T, int (T::*func)()>
class A {
public:
int count(T* p) { return (p->*func)(); }
};
class B {
public:
int funcPublic() { return 0; }
};
class C {
template<class T, int (T::*)()> friend class A;
private:
int funcPrivate() { return 0; }
};
typedef A<B, &B::funcPublic > AB; // works
typedef A<C, &C::funcPrivate> AC; // g++: "error: ‘int C::funcPrivate()’ is private"
Erişim kontrolü oldukça kullanım noktasında daha söz noktasına (yani şablon örneği) kontrol edilmesi gereken noktalar görünüyor. C++ nasıl belirtilir? Ben sadece şanstan muyum? Eğer sınıf C
değiştirebilirsiniz Eğer
İlgili (ancak üye işlevine değil, gösterici-üye değişkenini kullanarak): http://stackoverflow.com/a/3173080/103167 –
Tüm bu sınıfların bir arkadaşını A yapmak için can atıyorsunuz ama sen 'A' için çağırmak için ortak bir arayüz uygulamak için istekli değilsin? Garip bir gereksinim gibi görünüyor ... Ne yapmaya çalıştığınızı açıklarsanız, bazı yararlı geri bildirimler alabilirsiniz. – Nemo
@BenVoigt: Kod yazmam gerektiği noktada, tasarımımın yanlış olduğunu farz ediyorum. – Nemo