#include <iostream>

template <typename T>
class X {
public:
    X(T d): y(d) {}

private:
    class Y {
    public:
        Y(T d): data(d) {}

    private:
        T data;

        friend std::ostream &operator <<(std::ostream &os, Y const& y)
	    {
	        os << "Y(" << y.data << ")";
	        return os;
	    }
    };

    Y y;

    template <typename U>
    friend std::ostream &operator <<(std::ostream &os, const X<U> &x);
};

template <typename U>
std::ostream &operator <<(std::ostream &os, const X<U> &x) {
    os << "X " << x.y;
    return os;
}

int main() {
    std::cout << X<int>(1);
    return 0;
}