Если у меня есть нормальный класс, я могу «внедрить» в него несвободную функцию друга.(Это среди прочего может быть найдено только ADL).
case 1:
class A{
double p_;
friend double f(A const& a){return a.p_;}
};
Если вместо этого это класс шаблона, я могу сделать:
case 2:
template<class T>
class A{
double p_;
friend double f(A const& a){return a.p_;} // apparently A const& is a synomyn for A<T> const&
};
Теперь предположим, что мне нужно реализовать f
в терминах класса, который необходимо определить позже.В таком случае я пытался сделать это:
дело 3:
template<class T>
class A{
double p_;
friend double f(A const& a);
};
...
Это уже дает предупреждение:'объявляет не шаблонную функцию [-Wnon-template-friend] ".
Следуя советам компилятора, я могу сделать это:
template<class T> class A;
template<class T> double f(A<T> const& a);
template<class T>
class A{
double p_;
friend double f<>(A const& a);
};
template<class T> double f(A<T> const& a){return a.p_;}
Для чего требуется гораздо больше кода иЯ даже не уверен, что это на 100% эквивалентно случаю 2 abov, и это именно то, что я хочу, потому что теперь у меня есть действительно бесплатная функция, которая оказывается другом вместо введенного друга.
МожетСлучай 3 следует изменить, чтобы он был на 100% эквивалентен случаю 2 и по-прежнему иметь определение f
вне класса?Другими словами, можно ли внедрить функцию друга, определенную вне класса?
Я тоже это попробовал, что выдает ошибку компилятора:
template<class T>
class A{
double p_;
friend double f(A<T> const& a);
};
template<class T> double A<T>::f(A<T> const& a){return a.p_;}
Thisanswer находит то же решение, но не отвечает на вопрос о том, эквивалентен ли случай 3 случаю 2. Как правильно написать объявления функций-друзей в классе шаблона?