Страница 1 из 1

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

Добавлено: 10 фев 2006, 13:29
HKarel
Всем доброго времени суток.
Имеется некий класс 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.

Добавлено: 10 фев 2006, 15:42
Styopa
Получается, что у тебя и func1 недоступна. По крайней мере, мой С++ заявил, что "она не должна быть перегруженной".
Мне кажется, проще всего изменить класс Base и скрыть в нем все лишнее, а потом наследовать от него не protected, а public. Тогда, если я правильно мыслю, func1 и func2 сразу будут доступны у класса-потомка.

Добавлено: 10 фев 2006, 15:59
HKarel
Нет, ф-я func1 в классе Derived - доступна и она не перегружена.
Запись вида

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

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

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

using Base< T1, T2 >::func1; 
Ни о какой перезагрузке здесь речи не идет.
Мой компилятор кушает это без проблем.
Вопрос о перепроектировании классов не рассматривается, т.к. нужен именно этот вариант.

Добавлено: 10 фев 2006, 16:06
Eugie
Дык, в чем проблема? Тот же

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

using Base<T1,T2>::func2;

Добавлено: 10 фев 2006, 16:50
HKarel
А я хрен его знает в чем проблема.
Пишет: "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 работает как часы

Добавлено: 10 фев 2006, 17:13
Eugie

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

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

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

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

using inherited<UCompare>::Sort ;
?

Добавлено: 10 фев 2006, 18:01
HKarel
Это действительно BCB, но никакой не диалект, просто ранее было определено

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

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

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

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