Учитывая следующий код:объявляя набор функций-членов, как друг, используя шаблон
class A;
struct B {
static void doIt(A* pa);
};
struct C {
static void doIt(A* pa);
};
class A {
int i = 9;
// below works but requires a line per each type
friend void B::doIt(A* pa);
friend void C::doIt(A* pa);
// the below however doesn't work
// template<typename T>
// friend void T::doIt(A* pa);
// (gcc error: member 'void T::doIt(A*)' declared as friend before type 'T' defined)
// (clang just ignores the above and the error is on accessing A::i in B and C)
};
void B::doIt(A* pa) {
cout << pa->i << endl;
}
void C::doIt(A* pa) {
cout << pa->i *2 << endl;
}
int main() {
A a;
B::doIt(&a);
C::doIt(&a);
}
Можно ли заменить многократные friend
декларации, чтобы все void T::doIt(A* pa)
методов доступа к закрытым членам A
?
Попытка создать экземпляр B
и C
выше A
не помогает.
'шаблон друга аннулируются T :: Doit (A * годовых);' не является полезной декларацией. Компилятор должен знать имя * class *, * function *, * class-template * или * function-template *, которое подружится с 'A'. 'T' - это не имя, которое он знает, и он не может перейти к тому, чтобы каждый член' A' был доступен для 'T' –
WhiZTiM
Дружба никогда не была хорошим выбором дизайна. Это всего лишь обходной путь в некоторых «отчаянных» ситуациях ... Возьмите это как возможность пересмотреть свой дизайн. –
@ A.S.H: Неправда. Дружба - отличный способ улучшить инкапсуляцию. –