#include <iostream>
using namespace std;
template < int i, typename T = int > struct A
{
T num = i;
A< i, T> ( )
{
cout << "Instantiated a A<" << i << ">" << endl;
}
} ;
template < int i, int i2> struct B
{
static A< i> a;
static A< i * i2> a2;
} ;
template < int i, int i2> A< i> B< i, i2> :: a { } ;
template < int i, int i2> A< i * i2> B< i, i2> :: a2 { } ;
template < typename T> struct C
{
static void doSomething( )
{
cout << "Have a A<" << T:: a .num << "> and a A<" << T:: a2 .num << "> in C" << endl;
}
} ;
int main( ) {
typedef C< B< 2 , 2 >> c;
cout << "Typedefined a C\n Calling static member function to initialize C<B<2, 2>>'s B<2, 2>'s A<>s" << endl;
c:: doSomething ( ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8aW50IGksIHR5cGVuYW1lIFQgPSBpbnQ+IHN0cnVjdCBBCnsKCVQgbnVtID0gaTsKCUE8aSwgVD4oKQoJewoJCWNvdXQgPDwgIkluc3RhbnRpYXRlZCBhIEE8IiA8PCBpIDw8ICI+IiA8PCBlbmRsOwoJfQp9OwoKdGVtcGxhdGU8aW50IGksIGludCBpMj4gc3RydWN0IEIKewoJc3RhdGljIEE8aT4gYTsKCXN0YXRpYyBBPGkgKiBpMj4gYTI7Cn07CnRlbXBsYXRlPGludCBpLCBpbnQgaTI+IEE8aT4gQjxpLCBpMj46OmF7fTsKdGVtcGxhdGU8aW50IGksIGludCBpMj4gQTxpICogaTI+IEI8aSwgaTI+OjphMnt9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEMKewoJc3RhdGljIHZvaWQgZG9Tb21ldGhpbmcoKQoJewoJCWNvdXQgPDwgIkhhdmUgYSBBPCIgPDwgVDo6YS5udW0gPDwgIj4gYW5kIGEgQTwiIDw8IFQ6OmEyLm51bSA8PCAiPiBpbiBDIiA8PCBlbmRsOwoJfQp9OwoKaW50IG1haW4oKSB7Cgl0eXBlZGVmIEM8QjwyLCAyPj4gYzsKCWNvdXQgPDwgIlR5cGVkZWZpbmVkIGEgQ1xuQ2FsbGluZyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgQzxCPDIsIDI+PidzIEI8MiwgMj4ncyBBPD5zIiA8PCBlbmRsOwoJYzo6ZG9Tb21ldGhpbmcoKTsKCXJldHVybiAwOwp9