gpt4 book ai didi

c++ - 在模板类外部定义非模板函数

转载 作者:行者123 更新时间:2023-12-01 22:35:21 26 4
gpt4 key购买 nike

我正在学习模板类的非模板友元函数和模板友元函数。所以我尝试了下面的代码:

#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;}
};

但我想知道,是否有什么技巧可以在类定义之外定义友元函数?

谢谢。

最佳答案

如果您想要在类之外定义,它需要是一个模板函数,因为它必须能够接受任何类型的 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;
}

关于c++ - 在模板类外部定义非模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59902111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com