CRTPで依存関係のある型を使いたいですが、コンパイルエラーになります。


下記のソースコードでどのようにすれば `S` で `D::T` が使えるようになりますでしょうか？

[code]

    template<typename Derived>
    struct S {
        using I = typename Derived::T;
    };
    
    struct D : S<D> {
        using T = int;
    };
    
    int main()
    {
        D d;
        return 0;
    }
    
[/code]




<https://stackoverflow.com/questions/47606667/how-to-get-typename-defined-in-
derived-from-base-class>  
上記リンクを参考にしていい感じになりそうだったので共有します。  
何が起こっているのか有識者の方教えていただけると幸いです。

[code]

    template <class T>
    struct traits;
    
    template <class Derived>
    struct Base {
      typedef typename traits<Derived>::T T;
    };
    
    template <typename T_>
    struct Impl : public Base<Impl<T_>> {
      typedef T_ T;
    };
    
    template <typename T_>
    struct traits<Impl<T_>> {
      typedef T_ T;
    };
    
    
    using SpecialImpl = Impl<int>;
    
    int main(){
        SpecialImpl si;
        
    }
    
[/code]

