template <typename T>
class First {
int a;
template<typename> friend class Second;
};
template <typename T>
class Second
{
int b;
template<typename> friend class First;
};
Это позволит каждому First<T>
получить доступ к внутренности каждого Second<U>
. Теперь, хотя это техническое решение, вы можете подумать, является ли дизайн с циклическими зависимостями и открытием внутреннего для любого экземпляра другого класса лучшим решением для вашей конкретной проблемы.
Кстати, если вы хотите, чтобы предоставить First<int>
доступ к Second<int>
(и не Second<double>
), вы можете сделать это следующим образом:
template <typename> class Second;
template <typename T>
class First {
int a;
friend class Second<T>; // only befriend the same instantiation
};
template <typename T>
class Second {
int b;
friend class First<T>;
};
В этом втором варианте вам необходимо опережающее объявление о Second
шаблона перед тем подружился конкретное создание экземпляра, но это позволяет предоставить доступ к внутренним компонентам класса только к определенному экземпляру.
Нет, это не ясно, что вы имеете в виду. Вы хотите, чтобы каждый класс был другом другого? – CashCow
Он называется _class template_, потому что это шаблон, из которого вы создаете классы. Это не класс, и вы не можете его использовать, как если бы это был класс: 'class mine: public First {};' fail, потому что 'First' не является классом. 'Первый', OTOH, является и может быть использован как таковой. –
sbi