Шаблоны и управление доступом.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
HKarel
Сообщения: 25
Зарегистрирован: 07 дек 2004, 14:50

Всем доброго времени суток.
Имеется некий класс Base.

Код: Выделить всё

template< typename T1, typename T2 > 
class Base
{
public:
  func1();
  template< typename T3 > func2( T3 t );
};
Имеем от класса Base защищенного наследника Derived.

Код: Выделить всё

template< typename T1, typename T2 >
class Derived : protected Base< T1, T2 >
{

public:
  // переопределяем доступ для ф-ции func1
  Base< T1, T2 >::func1;
  // Какой должна быть запись для func2 ???
};
Собственно вопрос в том, как правильно сделать запись
для того чтобы шаблонная ф-я func2 стала доступной
из класса Derived.
Сложность - это мера непонимания.
Styopa
Сообщения: 40
Зарегистрирован: 30 сен 2004, 19:22
Откуда: Севастополь
Контактная информация:

Получается, что у тебя и func1 недоступна. По крайней мере, мой С++ заявил, что "она не должна быть перегруженной".
Мне кажется, проще всего изменить класс Base и скрыть в нем все лишнее, а потом наследовать от него не protected, а public. Тогда, если я правильно мыслю, func1 и func2 сразу будут доступны у класса-потомка.
В жизни программиста всего три плюса. Из них два - в Си++, а третий - крест на его могиле.
HKarel
Сообщения: 25
Зарегистрирован: 07 дек 2004, 14:50

Нет, ф-я func1 в классе Derived - доступна и она не перегружена.
Запись вида

Код: Выделить всё

Base< T1, T2 >::func1; 
только переопределяет область доступа с protected до public для класса Derived. Это не противоречит стандарту:

Код: Выделить всё

using Base< T1, T2 >::func1; 
Ни о какой перезагрузке здесь речи не идет.
Мой компилятор кушает это без проблем.
Вопрос о перепроектировании классов не рассматривается, т.к. нужен именно этот вариант.
Сложность - это мера непонимания.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Дык, в чем проблема? Тот же

Код: Выделить всё

using Base<T1,T2>::func2;
HKarel
Сообщения: 25
Зарегистрирован: 07 дек 2004, 14:50

А я хрен его знает в чем проблема.
Пишет: "E2247 'member' is not accessible Compiler error"
Пришлось перегрузить ф-ю в наследнике.
Вот реальный код:

Код: Выделить всё

  template< typename UCompare >
  void Sort( const UCompare &Compare,
             ESortMode SortMode = lst::SortUp, void *ExtParam = NULL )
  { inherited::Sort( Compare, SortMode, ExtParam ); }
Причем, если в базовам классе Sort определена без template< typename UCompare > , то директива using inherited::Sort работает как часы
Сложность - это мера непонимания.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Код: Выделить всё

inherited::Sort 
Это что за диалект - ВСВ, что ли? Не пользуюсь
Может, особенности компилятора или просто баг.

Такой вариант не пробовал:

Код: Выделить всё

using inherited<UCompare>::Sort ;
?
HKarel
Сообщения: 25
Зарегистрирован: 07 дек 2004, 14:50

Это действительно BCB, но никакой не диалект, просто ранее было определено

Код: Выделить всё

  typedef TListT< T, TCompare >  inherited;
Так что бы если TListT поменяется, то кучу коде не переписывать.
Конструкция вида

Код: Выделить всё

using inherited<UCompare>::Sort; 
Не пройдет, т.к. непонятно что за спецификатор UCompare.
Оставлю переопределенную ф-цию, со временем может найду решение. Однако в моих книгах по темплитам о такой ситуации ничего не сказано :(
Сложность - это мера непонимания.
Ответить