Вы должны использовать typename
:
typename T::value_type pop()
и т. Д.
Причина в том, что компилятор не может знать, является ли T :: value_type типом переменной-члена (никто не мешает вам определить тип struct X { int value_type; };
и передать его в шаблон). Однако без этой функции код не может быть проанализирован (поскольку значение конструкций изменяется в зависимости от того, обозначает ли какой-либо идентификатор тип или переменную, например, T * p
может быть умножением или объявлением указателя). Следовательно, правило состоит в том, что все, что может быть типом или переменной и явно не помечено как тип с префиксом typename
, считается переменной.