Доступ к вложенному шаблонному типу не шаблонного класса
Имею следующую (абстрактную !!!) структуру:
- Шаблонный класс, с двумя параметрами. Первый параметр - это тип хранимых данных, второй - аллокатор, который имеет значение по-умолчанию. Также, класс имеет метод, который в качестве аргумента принимает аллокатор. (container)
- Следующий класс - обертка над аллокатором, хранит в себе вложенную структуру, которая определяет псевдоним аллокатора. (allocator)
- Заключительный класс - класс самого аллокатора. (_alloc)
Код:
template <class T>
class _alloc
{
};
struct allocator
{
template<class T>
struct helper_allocator
{
typedef _alloc<T> hlp_allocator;
};
};
template <class T, class all = allocator>
class container
{
public:
void replace_allocator(const all::helper_allocator<T>::hlp_allocator& a)
{
}
};
int main()
{
allocator::helper_allocator<int>::hlp_allocator a;
container<int, allocator> t;
t.replace_allocator(a);
return 0;
}
При компиляции получаю ошибку syntax error: identifier 'helper_allocator' в методе replace_allocator класса container. Объясните, где я недопонимаю? Если использовать вместо параметра шаблона all напрямую тип allocator, то компиляция успешна.
P.S.: using не применимо, т.к. C++ 11 недоступен.
Ответы (2 шт):
Структура helper_allocator определена только для allocator. Для любой другой сущности она не существует, поэтому для какого то типа allона тоже не существует, потому что all только по умолчанию есть allocator, но он может быть и другим типом. А раз может, значит синтаксис не верный. Другое дело, если вы определите all как псевдоним типа allocator, тогда компилятору будет известно, что это только один тип, в котором определен искомый тип: using all = allocator; Или же к зависимой имени helper_allocator<t>нужно обращаться только через allocator
Надо просто typename поставить:
template <class T>
class _alloc
{
};
struct allocator
{
template<class T>
struct helper_allocator
{
typedef _alloc<T> hlp_allocator;
};
};
template <class T, class all = allocator>
class container
{
public:
void replace_allocator(const typename all::helper_allocator<T>::hlp_allocator& a)
{
}
};
int main()
{
allocator::helper_allocator<int>::hlp_allocator a;
container<int, allocator> t;
t.replace_allocator(a);
return 0;
}
И лучше не использовать в глобальном скопе идентификаторы, начинающиеся с _, потому что они считаются зарезервированными