Страница 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 - доступна и она не перегружена.
Запись вида
только переопределяет область доступа с
protected до
public для класса Derived. Это не противоречит стандарту:
Ни о какой перезагрузке здесь речи не идет.
Мой компилятор кушает это без проблем.
Вопрос о перепроектировании классов не рассматривается, т.к. нужен именно этот вариант.
Добавлено: 10 фев 2006, 16:06
Eugie
Дык, в чем проблема? Тот же
Добавлено: 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
Это что за диалект - ВСВ, что ли? Не пользуюсь
Может, особенности компилятора или просто баг.
Такой вариант не пробовал:
?
Добавлено: 10 фев 2006, 18:01
HKarel
Это действительно BCB, но никакой не диалект, просто ранее было определено
Так что бы если TListT поменяется, то кучу коде не переписывать.
Конструкция вида
Не пройдет, т.к. непонятно что за спецификатор UCompare.
Оставлю переопределенную ф-цию, со временем может найду решение. Однако в моих книгах по темплитам о такой ситуации ничего не сказано
