所以我有一个模板化的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的私有成员。因为operator =是特殊的,所以我不能重载operator =作为非成员函数,并且像我通常那样和朋友声明一样说吧
template<typename U> friend vektor<U>& operator=(const vektor<T> &r);
还返回“必须是非静态成员函数”
在这个例子中有没有办法给予友谊?
答案 0 :(得分:2)
这个问题有两个快速解决方案(两者都不理想)。
假设具有非常有趣的名称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;
};