C++:制作模板运算符 = 重载好友

C++: Making a template operator= overload a friend

本文关键字:运算符 重载 好友 C++      更新时间:2023-10-16

所以我有一个模板化的vektor类

template<t>
class vektor
{
...
}

我希望能够写

vektor<int> x;
vektor<float> y;
...
y = x;

所以我修改了类

template<t>
class vektor
{
template<typename U>
vektor<T>& operator=(const vektor<U> &r) {
....
}
...
}

我希望这个函数与 r 成为朋友;也就是说,我希望能够访问 r 的私人成员。由于运算符=很特殊,因此我不能将运算符=重载为非成员函数并像往常一样与它交朋友,并像往常一样与朋友声明

template<typename U> friend vektor<U>& operator=(const vektor<T> &r);

还返回"必须是非静态成员函数">

在这个例子中,有没有办法赋予友谊?

这个问题有两种快速解决方案(它们都不理想)。

假设名称非常有趣的类vektor如下所示(它只是一个示例,应说明以下代码):

template<typename T>
class vektor
{
T data;
public:
vektor(T otherData) :
data(otherData)
{
}
T GetData() const
{
return data;
}
// ...
};

这两种解决方案都可以在以下代码示例上进行测试:

vektor<int> x(1);
vektor<float> y(2.0f);
y = x;
std::cout << "x.data = " <<  x.GetData() << std::endl;
std::cout << "y.data = " <<  y.GetData() << std::endl;

第一个解决方案:辅助友元函数模板

在此解决方案中,辅助友元函数Copy用于执行所有复制操作,并从复制赋值运算符调用:

template<typename T>
class vektor
{
// ...
public:
// ...
template<typename U>
vektor<T>& operator=(const vektor<U>& r)
{
return Copy(*this, r);
}
template<typename V, typename U>
friend vektor<V>& Copy(vektor<V>& l, const vektor<U>& r);
};
template<typename V, typename U>
vektor<V>& Copy(vektor<V>& l, const vektor<U>& r)
{
l.data = static_cast<V>(r.data);
return l;
}

第二种解决方案:友语类模板

第二种解决方案是使所有类模板实例化彼此vektor友:

template<typename T>
class vektor
{
// ...
public:
// ...
template<typename U>
vektor<T>& operator=(const vektor<U>& r)
{
data = static_cast<T>(r.data);
return *this;
}
template<typename U>
friend class vektor;
};