template<typename T> class Vnejsi {
public:
    template<int N> class Stred {
    public:
        template<int M> class Vnitrni
        {
        public:
            virtual void f();
        };
    };
};

template<typename T, int N> class Test
{
public:
    void f1(Vnejsi<T>::template Stred<N>::template Vnitrni<N>* p)
    {
        p -> template Vnitrni<N>::f();
    }
    void f2(Vnejsi<T>::template Stred<N>::template Vnitfni<N>& p)
    {
        p.template vnitrni<N>::f();
    }
};
