#include <iostream>
template<typename T>
struct Outer
{
private:
void foo()
{
std::cout << "Outer<T>::foo()" << std::endl;
}
public:
Outer() : inner( *this , &Outer::foo )
{
inner();
}
struct Inner
{
typedef void (Outer<T>::*F)();
Inner( Outer<T>& o , F f ) : outer( o ) , func( f )
{
}
void operator()()
{
(outer.*func)();
}
F func;
Outer<T>& outer;
};
Inner inner;
};
int main()
{
Outer<int> outer;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IE91dGVyCnsKcHJpdmF0ZToKCXZvaWQgZm9vKCkKCXsKICAgICAgICBzdGQ6OmNvdXQgPDwgIk91dGVyPFQ+Ojpmb28oKSIgPDwgc3RkOjplbmRsOwoJfQogICAgCnB1YmxpYzogICAgCglPdXRlcigpIDogaW5uZXIoICp0aGlzICwgJk91dGVyOjpmb28gKSAKCXsKICAgICAgICBpbm5lcigpOwoJfQogICAgCglzdHJ1Y3QgSW5uZXIKCXsKICAgICAgICB0eXBlZGVmIHZvaWQgKE91dGVyPFQ+OjoqRikoKTsKICAgICAgICAKCQlJbm5lciggT3V0ZXI8VD4mIG8gLCBGIGYgKSA6IG91dGVyKCBvICkgLCBmdW5jKCBmICkKCQl7CgkJfQogICAgICAgIAogICAgICAgIHZvaWQgb3BlcmF0b3IoKSgpCiAgICAgICAgewogICAgICAgICAgICAob3V0ZXIuKmZ1bmMpKCk7CiAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgRiBmdW5jOwogICAgICAgIE91dGVyPFQ+JiBvdXRlcjsKCX07CiAgICAKICAgIElubmVyIGlubmVyOwp9OwoKaW50IG1haW4oKQp7CglPdXRlcjxpbnQ+IG91dGVyOwp9