#include <iostream>

using namespace std;

template <class T> class X;

template <typename T>
T f1( const T& t, X<int> x) { cout << x.priv << endl; return t; }

template <typename T, typename Q>
T f2( const T& t, Q x) { cout << x.priv << endl; return t; }

template <typename T>
int f3( X<T> x) { cout << x.priv << endl; return 0; }

int f4(X<int> x);   // itt meg nem tudja, hogy van x.priv

template <typename T>
class X
{
public:
    X() { priv = 1; }
private:
    template <typename S> friend S f1(const S&, X<int>);
//  template <typename S> friend S f2(const S&, X);
    friend int f3<>(X);
    friend int f4(X<int>);
    int priv;
};

int main()
{
    X<int> x;
    f1( 3.3, x);
//  f2( 3.3, x);
    f3(x);
    f4(x);
    return 0;
}

int f4(X<int> x) { cout << x.priv << endl; return 0; }