Czy można w jakiś sposób uczynić częściową specyfikację szablonu przyjacielem? To znaczy. rozważyć masz następujące klasy SzablonSzablony w języku C++: Częściowe specyfikacje szablonów i klasy znajomych
template <class T> class X{
T t;
};
teraz masz częściowych specjalizacji, na przykład, dla wskaźników
template <class T> class X<T*>{
T* t;
};
Co chcę osiągnąć jest to, że każda możliwa X<T*>
jest klasa przyjaciel X<S>
dla dowolnego S
. To znaczy. X<A*>
powinien być przyjacielem X<B>
.
Oczywiście, myślałem o zwykłej deklaracji znajomego szablonu X:
template <class T> class X{
template <class S> friend class X<S*>;
}
Jednak to nie skompilować, g ++ mi mówi to:
test4.cpp: 34: 15: błąd : specjalizacja 'template<class T> class X
' musi pojawić się w zakresie przestrzeni nazw
test4.cpp: 34: 21: błąd: częściowej specjalizacji 'X<S*>
' ogłoszony 'przyjaciel'
Czy to w ogóle nie jest możliwe, czy istnieje jakieś obejście tego problemu?
Powodem dlaczego pytam jest to, że muszę konstruktora X<T*>
, który tworzy tę klasę z dowolnego X<S>
(S
musi być podtypem T
).
Kod wygląda następująco:
template <class T> class X<T*>{
T* t;
template<class S>
X(X<S> x) : t(&(x.t)) {} //Error, x.t is private
}
Teraz kompilator narzeka, oczywiście, że nie jest x.t
visibile w konstruktorze, ponieważ jest prywatne. Dlatego potrzebuję częściowej klasy przyjaciół specjalności.
Czy funkcja 'get' naprawdę nie wchodzi w grę? Wydaje mi się, że jest to dla mnie o wiele czystsze i omija szaleństwo przyjaciela. – pmr
może to działać w tym przykładzie. Mogą jednak istnieć dane, które nie powinny być dostępne publicznie, a jedynie szablonowe specjalizacje. Pytanie brzmi, czy to zachowanie jest jakoś możliwe. – gexicide