Я узнал о функции друга без шаблона и функции друга с шаблоном в шаблонном классе. Поэтому я попробовал приведенный ниже код:
#include <iostream>
template<typename T>
class cl
{
private :
T val;
public:
cl()= default;
explicit cl(T v) : val(std::move(v)) {}
friend void non_template_friend(cl m);
};
template <typename T>
void non_template_friend(cl<T> m) { std::cout << m.val << std::endl;}
int main()
{
cl<int> c(10);
non_template_friend(c);
return 0;
}
, поэтому при компиляции я получил: undefined reference to
non_template_friend (cl) '`Итак, чтобы решить, что мне нужно переместить определение функции-друга в определение класса, вот так :
template<typename T>
class cl
{
private :
T val;
public:
cl()= default;
explicit cl(T v) : val(std::move(v)) {}
friend void non_template_friend(cl m) { std::cout << m.val << std::endl;}
};
Но мне было интересно, есть ли какая-нибудь хитрость, чтобы можно было определить поведение друга вне определения класса?
Спасибо.