#include <iostream>
using std:: cout ;
using std:: endl ;
class C {
public :
C( ) { cout << "Constructor of C called" << endl; }
~C( ) { cout << "Donstructor of C called" << endl; }
} ;
template < typename T>
class A {
public :
A( ) { cout << "Constructor of A called" << endl; }
~A( ) { cout << "Destructor of A called" << endl; }
class B {
public :
B( ) { cout << "Constructor of A::B called" << endl; }
~B( ) { cout << "Destructor of A::B called" << endl; }
} ;
} ;
void TestFreeC( ) {
cout << "TestFreeC:" << endl;
C free_c;
cout << endl;
}
void TestFreeA( ) {
cout << "TestFreeA:" << endl;
A< C> free_a_for_free_c;
cout << endl;
}
void TestNotFreeB( ) {
cout << "TestNotFreeB:" << endl;
A< C> :: B not_free_b_of_free_a_for_free_c;
cout << endl;
}
void TestFreeAForNotFreeB( ) {
cout << "TestFreeAForNotFreeB:" << endl;
A< A< C> :: B > free_a_for_not_free_b_of_free_a_for_free_c;
cout << endl;
}
void GoingCrazy( ) {
cout << "They are coming!: " << endl;
A< A< A< A< A< C> :: B > :: B > :: B > :: B > strange_thing;
cout << endl;
}
int main( ) {
TestFreeC( ) ;
TestFreeA( ) ;
TestNotFreeB( ) ;
TestFreeAForNotFreeB( ) ;
GoingCrazy( ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgc3RkOjpjb3V0Owp1c2luZyBzdGQ6OmVuZGw7CgpjbGFzcyBDIHsKIHB1YmxpYzoKICBDKCkgeyBjb3V0IDw8ICJDb25zdHJ1Y3RvciBvZiBDIGNhbGxlZCIgPDwgZW5kbDsgfQoKICB+QygpIHsgY291dCA8PCAiRG9uc3RydWN0b3Igb2YgQyBjYWxsZWQiIDw8IGVuZGw7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBBIHsKIHB1YmxpYzoKICBBKCkgeyBjb3V0IDw8ICJDb25zdHJ1Y3RvciBvZiBBIGNhbGxlZCIgPDwgZW5kbDsgfQogIH5BKCkgeyBjb3V0IDw8ICJEZXN0cnVjdG9yIG9mIEEgY2FsbGVkIiA8PCBlbmRsOyB9CgogIGNsYXNzIEIgewogICBwdWJsaWM6CiAgICBCKCkgeyBjb3V0IDw8ICJDb25zdHJ1Y3RvciBvZiBBOjpCIGNhbGxlZCIgPDwgZW5kbDsgfQogICAgfkIoKSB7IGNvdXQgPDwgIkRlc3RydWN0b3Igb2YgQTo6QiBjYWxsZWQiIDw8IGVuZGw7IH0KICB9Owp9OwoKdm9pZCBUZXN0RnJlZUMoKSB7CiAgY291dCA8PCAiVGVzdEZyZWVDOiIgPDwgZW5kbDsKICBDIGZyZWVfYzsKICBjb3V0IDw8IGVuZGw7Cn0KCnZvaWQgVGVzdEZyZWVBKCkgewogIGNvdXQgPDwgIlRlc3RGcmVlQToiIDw8IGVuZGw7CiAgQTxDPiBmcmVlX2FfZm9yX2ZyZWVfYzsKICBjb3V0IDw8IGVuZGw7Cn0KCnZvaWQgVGVzdE5vdEZyZWVCKCkgewogIGNvdXQgPDwgIlRlc3ROb3RGcmVlQjoiIDw8IGVuZGw7CiAgQTxDPjo6QiBub3RfZnJlZV9iX29mX2ZyZWVfYV9mb3JfZnJlZV9jOwogIGNvdXQgPDwgZW5kbDsKfQoKdm9pZCBUZXN0RnJlZUFGb3JOb3RGcmVlQigpIHsKICBjb3V0IDw8ICJUZXN0RnJlZUFGb3JOb3RGcmVlQjoiIDw8IGVuZGw7CiAgQTxBPEM+OjpCPiBmcmVlX2FfZm9yX25vdF9mcmVlX2Jfb2ZfZnJlZV9hX2Zvcl9mcmVlX2M7CiAgY291dCA8PCBlbmRsOwp9Cgp2b2lkIEdvaW5nQ3JhenkoKSB7CiAgY291dCA8PCAiVGhleSBhcmUgY29taW5nITogIiA8PCBlbmRsOwogIEE8QTxBPEE8QTxDPjo6Qj46OkI+OjpCPjo6Qj4gc3RyYW5nZV90aGluZzsKICBjb3V0IDw8IGVuZGw7Cn0KCmludCBtYWluKCkgewogIFRlc3RGcmVlQygpOwogIFRlc3RGcmVlQSgpOwogIFRlc3ROb3RGcmVlQigpOwogIFRlc3RGcmVlQUZvck5vdEZyZWVCKCk7CiAgR29pbmdDcmF6eSgpOwp9Cg==