Napotkałem na problem składniowy, którego nie umiem rozwiązać. Konstrukcja, którą przedstawiam jest okrojona w porównaniu do projektu, który próbuję stworzyć - więc proszę, nie piszcie: zamiast tego stwórz klasy w takiej i takiej hierarchii. Hierarchia jest bardziej skomplikowana, i trochę musiałem pomyśleć, żeby ująć całość tak prosto, jak poniżej (mam nadzieję, że prosto).
Mam szablon klasy, który używa klasy Pojemnik. Klasa pojemnik jest zdeklarowana gdzieś niżej. Funkcje składowe Pokazywacza są zdefiniowane jeszcze niżej.
class Pojemnik;
template<typename Typ>
class Pokazywacz {
public:
void pokaz(Pojemnik& arg);
};
Klasa Pojemnik jest zwykłą klasą. Pokazywacz może do woli korzystać w swoich funkcjach z publicznych właściwości Pojemnika - miło. Problem w tym, że chcę grzebać również z właściwości prywatnych. Muszę zadeklarować przyjaźń, i głupia sprawa - nie wiem jak:
class Pojemnik {
private:
int value;
public:
// taka deklaracja działa (przyjaźń z int'owym Pokazywaczem) ale to za mało
friend class Pokazywacz<int>;
// błąd: wymagany argument dla szablonu
friend class Pokazywacz;
// błąd: częściowa specjalizacja szablonu nie specjalizuje żadnych argumentów
template<class typ> friend class Pokazywacz<typ>;
// błąd: oczekiwane [unqualified-id] przed słowem template (co oznacza unqualified-id?)
friend template<class typ> class Pokazywacz<typ>;
};
dla ścisłości podam jeszcze, jak zdefiniowana jest funkcja:
template<typename Typ>
void Pokazywacz<Typ>::pokaz(Pojemnik& arg) {
// no i tu oczywiście jest błąd: int Pojemnik::value jest w tym kontekście prywatny
cout << arg.value << endl;
}
Przepraszam, za przyklejenie tego, ale zależy mi na rozwiązaniu w dowolnym czasie - jak ktoś napisze za x tygodni, jak zadeklarować tę nieszczęsną przyjaźń to też będzie super, a po takim czasie to pytanie już dawno spadłoby gdzieś na n-tą stronę. (nie śpieszy mi się, bo problem można rozwiązać siłowo: upubliczniając problematyczne składniki, ale jeśli da się tego uniknąć, to wolałbym z tego skorzystać).