#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;
bool X = j<3> > 1;

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;


template<typename T>
int
myFunc1(typename T::Subtype val);

int
myFunc2(T::Subtype val);
