SequenceCheckResult<int>::directiontype
лучше подходит для SequenceCheckResult<int>::directiontype
, чем int
(потому что это точно), но int
лучше, чем SequenceCheckResult<_T>::directiontype
(потому что для данной специализации SequenceCheckResult<_T>
, directiontype
может быть любого типа, даже если мы по крайней мере указали, что это тип с typename
).
Редактировать: и, как указывает KerrekSB, даже если directiontype
как-то известно как int
для всех _T
, это лишило бы нас возможности определить, какой _T
использовать, что вызывает проблему хотя мы знаем, что на самом деле не имеет значения, какой _T
используется.
Чтобы обойти это, определите enum вне класса шаблона. Определение его внутри подразумевает, что оно зависит от _T
, когда на самом деле это не так. Это может показаться удобным для обзора, но тот факт, что мы пишем это operator<<
, означает, что мы не можем полностью ограничить доступ в любом случае. Кроме того, велика вероятность, что конструкторы и фабричные методы действительно выиграют от внешнего доступа к directiontype
.