I tried many variations on that with GCC to no avail (nothing quite like guess-n-check programming, eh?).

To be honest, I'm not entirely sure its possible. Since something inside the class is would be responsible in part for defining its own type, the logic seems like it'd become circular to have Inner as a valid template argument.

Heres my rationale (anyone, feel free to shoot holes in this, I'm just trying to reason my way through this):

You have four types, A1, A2, B1, B2.

Outer<A1, A2> is a different type from Outer<B1, B2>, and consequently, Outer<A1, A2>::Inner is a different type from Outer<B1, B2>::Inner. Therefore, the type Outer::Inner is incomplete, and therefore, cannot fully define another type. It would be valid to have Outer<A1, A2>::Inner as one of the template parameters, but not Outer::Inner.

Consider this:
You have Outer<T1, Inner>. Inner is of course (as it is completely defined) Outer<T1, Inner>::Inner, so your declaration is something like this: