 an enclosing type without producing compiler errors. Of course
      if we absolutely know what types we have and that a nested type exists, and
      these declarations are within our scope, we can always use an expression like
      'T::InnerType' without compiler error. But this is often not the case when
      doing template programming since the type being passed to us at compile-time
      in a class or function template is chosen at instantiation time and is created
      by the user of a template.
