#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) {}
template <typename T2>
friend std::ostream& operator<<(std::ostream& os, const C<T2>& dt);
private:
T data_;
};
template <typename T>
std::ostream& operator<<(std::ostream& os, const C<T>& dt)
{
C<char> c('!'); // Also has access even when T != char
return os << dt.data_ << c.data_;
}
int main()
{
C<int> der(234);
std::cout << der;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEM7CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzxUPiYgZHQpOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIEMKewpwdWJsaWM6CiAgICBleHBsaWNpdCBDKFQgZGF0YSkgOiBkYXRhXyhkYXRhKSB7fQogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQyPgogICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDPFQyPiYgZHQpOwpwcml2YXRlOgogICAgVCBkYXRhXzsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzxUPiYgZHQpCnsKICAgIEM8Y2hhcj4gYygnIScpOyAvLyBBbHNvIGhhcyBhY2Nlc3MgZXZlbiB3aGVuIFQgIT0gY2hhcgogICAgcmV0dXJuIG9zIDw8IGR0LmRhdGFfIDw8IGMuZGF0YV87Cn0KCmludCBtYWluKCkKewogICAgQzxpbnQ+IGRlcigyMzQpOwogICAgc3RkOjpjb3V0IDw8IGRlcjsKfQo=