2

テンプレート基本クラスと派生テンプレート クラスがあります。派生したものには、基本クラスの同じ型のオブジェクトへの参照を保持する引数を持つオーバーロードされたメソッドがあります。これらがテンプレート クラスでない場合は、派生クラスを基本クラスのフレンドにして、この場合は基本の保護されたメンバーにアクセスできるようにしますが、テンプレートでこれを行うにはどうすればよいでしょうか?

template <typename T>
class base
{
    // If this wasn't a template class, I would have done this:
    // friend class derived;

public:
    base(T val)
        : val_(val)
    {
    }

    virtual void assign(const base<T>& other)
    {
        val_ = other.val_;
    }

protected:
    T val_;
};

template <typename T>
class derived : public base<T>
{
public:
    derived(T val)
        : base<T>(val)
    {
    }

    virtual void assign(const base<T>& other)
    {
        this->val_ = other.val_; // error: ‘int base<int>::val_’ is protected
    }
};

int main()
{
    derived<int> a(5);
    derived<int> b(6);
    b.assign(a);
    return 0;
}
4

1 に答える 1