C ++ производный шаблон класса: доступ к защищенному члену экземпляра

У меня есть базовый класс шаблона и производный класс шаблона. Производный имеет перегруженный метод с аргументом, который содержит ссылку на объект того же типа базового класса. Если бы это не был шаблонный класс, я бы сделал производный класс другом базового класса, чтобы в этом случае я мог получить доступ к защищенным элементам базы, но как мне сделать это с шаблонами?

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;
}

0

Решение

Почему иметь virtual? В вашем примере derived::assign() делает так же, как base::assign(),

class base
{
...
public:
...
void assign(const base<T>& other)
...
}
derived<int> b(6);
b.assign(a); //calls base<int>::assign(..)

Если derived должен сделать еще немного работы в assign(..)использовать
base<T>::assign(other); по предложению Игоря Тандетника. Не нужно использовать friend,

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector