#include <iostream>

// Forward declarations
template <typename T> class C;
template <typename T> std::ostream& operator<<(std::ostream& os, const C<T>& dt);

template <typename T>
class C
{
public:
    explicit C(T data) : data_(data) {}
    friend std::ostream& operator<< <>(std::ostream& os, const C& dt);
private:
    T data_;
};

template <typename T>
std::ostream& operator<<(std::ostream& os, const C<T>& dt)
{
    return os << dt.data_;
}


int main()
{
    C<int> der(234);
    std::cout << der;
}
