#include <list>
#include <map>
#include <vector>

#define MACRO(T) f < T > ()

class MyClass
{
public:
   std::map < int, bool > someData;
   std::map < int, std::list < bool > > otherData;
};

void foo()
{
   List < byte > bob = new List < byte > ();

}

A < B > foo;
A < B,C > bar;
A < B* > baz;
A < B < C > > bay;

void asd(void)
{
   A < B > foo;
   A < B,C > bar;
   A < B* > baz;
   A < B < C > > bay;
   if (a<b && b>c)
   {
      a = b<c>0;
   }
   if (a < bar() > c)
   {
   }
   a<up_lim() ? do_hi() : do_low;
   a[ a<b>c] = d;
}

template< typename T > class MyClass
{

}

template< typename T >
class MyClass
{
}

template< typename A, typename B, typename C > class MyClass : myvar(0),
   myvar2(0)
{

}

template< typename A, typename B, typename C > class MyClass
   : myvar(0),
   myvar2(0)
{

}


static int max_value()
{
   return (std :: numeric_limits < int >:: max )();
}

template< class Config_ >
priority_queue < Config_ >   ::   ~priority_queue ()  {

}

template< class T >
T test(T a) {
   return a;
}

int main() {
   int k,j;
   h g < int >;
   k=test < int > (j);
   return 0;
}

template< typename T, template< typename, unsigned int, unsigned int > class ConcreteStorageClass >
class RotationMatrix
   : public StaticBaseMatrix < T, 3, 3, ConcreteStorageClass >
{

public:

   RotationMatrix()
      : StaticBaseMatrix < T, 3, 3, ConcreteStorageClass > ()
   {
      // do some initialization
   }

   void assign(const OtherClass < T, 3, 3 >& other)
   {
      // do something
   }

};

int main()
{
   MyClass < double, 3, 3, MyStorage > foo;
}

template< typename CharT, int N, typename Traits >
inline std::basic_ostream < CharT,Traits >& FWStreamOut(std::basic_ostream < CharT,Traits >& os,
                                                        const W::S < CharT,N,Traits >& s)
{
   return operator << < CharT, N, Traits, char, std::char_traits < char > > ( os, s );
}

struct foo {
   type1 < int& > bar;
};
struct foo {
   type1 < int const > bar;
};


template< int i > void f();
template< int i > void g() {
   f < i - 1 > ();
   f < i > ();
   f < i + 1 > ();
   f < bar() > ();
}
void h() {
   g < 42 > ();
}

#include <vector>
std::vector < int > A(2);
std::vector < int > B;
std::vector < int > C(2);
std::vector < int > D;

template< class T > struct X { template< class U > void operator ()(U); };

template< class T > class Y { template< class V > void f(V); };

void (* foobar)(void) = NULL;
std::vector < void (*)(void) > functions;

#define MACRO( a ) a
template< typename = int > class X;
MACRO ( void f( X < >& x ) );
void g( X < >& x );

#include <vector>
typedef std::vector < std::vector < int > > Table;  // OK
typedef std::vector < std::vector < bool > > Flags;  // Error

void func(List < B > = default_val1);
void func(List < List < B > > = default_val2);

BLAH < (3.14>=42) > blah;

void foo()
{
   A < (X>Y) > a;
   a = static_cast < List < B > > (ld);
}

template< int i > class X { /* ... */ };
X<1>2>x1;       // Syntax error.
X < (1>2) > x2;    // Okay.

template< class T > class Y { /* ... */ };
Y < X < 1 > > x3;     // Okay, same as "Y<X<1> > x3;".
Y<X < 6 > >1 >> x4;  // Syntax error. Instead, write "Y<X<(6>>1)>> x4;".
Y < X < (6 >> 1) > > x4;

