C ++:使模板运算符=超载朋友

时间:2014-03-09 15:29:56

标签: c++ templates 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的私有成员。因为operator =是特殊的,所以我不能重载operator =作为非成员函数,并且像我通常那样和朋友声明一样说吧

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

还返回“必须是非静态成员函数”

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

1 个答案:

答案 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;

};