#include <iostream>
#include <cassert>

template <class T>
struct tink
{
    tink();
    
    void use();
    static tink inst;
    
};

bool initialized = false;

template <class T>
tink<T>::tink()
{
    std::cout << "initialized\n";
    initialized = true;
}

template <class T>
void tink<T>::use() { std::cout << "used\n"; }

template <class T>
tink<T> tink<T>::inst;

template <class T, class U>
struct fu
{
    fu();
};

template <class T, class U>
fu<T,U>::fu()
{
    std::cout << "fu\n";
    tink<U>::inst.use();
}

template <class T>
int f(int)
{
    fu<T,long> x;
}

int x = f<int>(0);

int main()
{
    assert(initialized);
}

