#include <iostream>
struct ostream {} cout;
template<typename T> struct A{ T t; };
struct B{};
namespace {
template<typename T>
ostream& operator<< (ostream& out, const A<T>&v)
{ return out << v.t; }
ostream& operator<< (ostream& out, const B&)
{ std::cout << "This should not compile" << std::endl; return out; }
void foo (const B &b) { std::cout << "hello" << std::endl; }
template<typename T>
void foo (const A<T> &a) { foo(a.t); }
}
int main(){
A<B> a;
cout << a;
foo(a);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IG9zdHJlYW0ge30gY291dDsgCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBeyBUIHQ7IH07CnN0cnVjdCBCe307CgpuYW1lc3BhY2Ugewp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpvc3RyZWFtJiBvcGVyYXRvcjw8IChvc3RyZWFtJiBvdXQsIGNvbnN0IEE8VD4mdikgCiAgeyByZXR1cm4gb3V0IDw8IHYudDsgfQoKb3N0cmVhbSYgb3BlcmF0b3I8PCAob3N0cmVhbSYgb3V0LCBjb25zdCBCJikgCiAgeyBzdGQ6OmNvdXQgPDwgIlRoaXMgc2hvdWxkIG5vdCBjb21waWxlIiA8PCBzdGQ6OmVuZGw7IHJldHVybiBvdXQ7IH0KCnZvaWQgZm9vIChjb25zdCBCICZiKSB7IHN0ZDo6Y291dCA8PCAiaGVsbG8iIDw8IHN0ZDo6ZW5kbDsgfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBmb28gKGNvbnN0IEE8VD4gJmEpIHsgZm9vKGEudCk7IH0KfQoKaW50IG1haW4oKXsKICBBPEI+IGE7CiAgY291dCA8PCBhOwogIGZvbyhhKTsKfQ==