I have seen the following piece of code at work

```
typedef int         real_type;
typedef vector<int> vector_type;

template <class ASD> class program_class
{
  public:
    typename ASD::vector_type member_func();
};

template <typename ASD> typename ASD::real_type program_class<ASD>::member_func()
{
    typedef typename ASD::real_type      R;
    typedef typename ASD::vector_type    V;

    return 123;
}

```

---

Conceptually, I don't understand how the return-type can be stated like this: `typename ASD::real_type`. In principle this requires that the type we instantiate `ASD` with is a class of typedefs, right? 

Can I see an example of how this is accomplished?