template <int N>
struct Outer{
struct Inner{
Inner(int n): sum(n){}
typename Outer<N-1>::Inner operator[](int n) const
{ return typename Outer<N-1>::Inner(sum + n); }
int sum;
};
typename Outer<N-1>::Inner operator[](int n) const
{ return typename Outer<N-1>::Inner(n); }
};
template<>
struct Outer<1> {
struct Inner {
Inner(int n): sum(n){}
int operator[](int n) const
{ return sum+n; }
int sum;
};
int operator[](int n) const
{ return n; }
};
int main()
{
Outer<1> sum1;
Outer<2> sum2;
return sum1[1] + sum2[1][1] - 3;
}