Blo*_*aRd 2 c++ templates friend-function template-classes
我正在学习模板化类的非模板友元函数和模板友元函数。所以我尝试了下面的代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
因此,当我编译时,我得到了:undefined reference tonon_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;}
};
Run Code Online (Sandbox Code Playgroud)
但我想知道,有什么技巧可以在类定义之外定义友元函数吗?
谢谢你。
如果你想在类之外定义,它需要是一个模板函数,因为它必须能够接受任何类型的c1.
您可以通过向前声明类和函数来实现这一点。
#include <iostream>
template<typename T>
class cl;
template<typename T>
void non_template_friend(cl<T> m);
template<typename T>
class cl
{
private :
T val;
public:
cl()= default;
explicit cl(T v) : val(std::move(v)) {}
friend void non_template_friend<T>(cl m); //Now we can refer to a specific instatiation of the template here
};
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;
}
Run Code Online (Sandbox Code Playgroud)