C++:制作模板运算符 = 重载好友
C++: Making a template operator= overload a friend
所以我有一个模板化的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;
};
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板