#include <iostream>
template <typename T>
class A
{
public:
template <typename S>
struct node
{
S value;
struct node* right;
struct node* left;
node() : value(42), right(), left() {}
};
node<T>* foo();
};
template <typename T>
typename A<T>::template node<T>* A<T>::foo()
{
node<T>* temp = new node<T>;
return temp;
}
int main()
{
A<int> obj;
typename A<int>::template node<int>* p = obj.foo();
std::cout << p->value << std::endl;
delete p;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIEEKewpwdWJsaWM6CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUz4KICAgIHN0cnVjdCBub2RlCiAgICB7CiAgICAgICAgUyB2YWx1ZTsKICAgICAgICBzdHJ1Y3Qgbm9kZSogcmlnaHQ7CiAgICAgICAgc3RydWN0IG5vZGUqIGxlZnQ7CiAgICAgICAgCiAgICAgICAgbm9kZSgpIDogdmFsdWUoNDIpLCByaWdodCgpLCBsZWZ0KCkge30KICAgIH07CiAgICAKICAgIG5vZGU8VD4qIGZvbygpOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnR5cGVuYW1lIEE8VD46OnRlbXBsYXRlIG5vZGU8VD4qIEE8VD46OmZvbygpCnsKICAgIG5vZGU8VD4qIHRlbXAgPSBuZXcgbm9kZTxUPjsKICAgIHJldHVybiB0ZW1wOwp9CgppbnQgbWFpbigpCnsKICAgIEE8aW50PiBvYmo7CiAgICB0eXBlbmFtZSBBPGludD46OnRlbXBsYXRlIG5vZGU8aW50PiogcCA9IG9iai5mb28oKTsKICAgIHN0ZDo6Y291dCA8PCBwLT52YWx1ZSA8PCBzdGQ6OmVuZGw7CiAgICBkZWxldGUgcDsKICAgIHJldHVybiAwOwp9