Ahoj,
chci se zeptat, proč když vytvářím přítele v šablonové třídě pomocí explicitní specializace, musím před šablonu třídy vložit deklarace těchto šablonových přátel?
Ahoj,
chci se zeptat, proč když vytvářím přítele v šablonové třídě pomocí explicitní specializace, musím před šablonu třídy vložit deklarace těchto šablonových přátel?
Nevím, jak je to přesně ve standartu. Ale řekl bych, že překladač potřebuje vědět, kde přesně je ten friend deklarován:
template<typename T>
class Pokus
{
friend class Kamarad<T>;
};
Když tam není žádná deklarace, tak překladač neví, jestli je ten Kamarad také ve třídě Pokus, nebo je je ve stejném namespace jako Pokus, nebo v nějakém nadřazeném namespace (třeba globálním). A pak tam ještě může dělat další chaos using namespace.
Pokud by tyto informace vyhodnocoval až tam, kde se ten template Pokus použije, mohlo by dojít k situaci, že v různých místech programu by se ten Kamarad vyhodnotil na úplně jiné třídy. Proto je potřeba udělat buď:
template<
typename T
>
class Pokus
{
template<typename > class Kamarad;
friend class Kamarad<T>;
Pokus()
{
}
...
template<typename TT> class Kamarad
{
...
}
}; // template class Pokus
nebo
template<typename T> class Kamarad;
template<
typename T
>
class Pokus
{
friend class Kamarad<T>;
Pokus()
{
}
}; // template class Pokus
...
template<typename T>
class Kamarad
{
...
};
Děkuji
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku