};
template<template<class> class D,class E> class C
-{ // ERROR - ref below
+{
};
int main()
--- /dev/null
+// Build don't link:
+
+template<class M, class T> struct temp2;
+template<template<class> class M, class T> struct temp2<M<T>, T> {};
+
+template<class M> struct temp1;
+template<template<class> class M, class T> struct temp1<M<T> > {};
--- /dev/null
+// Build don't link:
+
+template <template<class> class TT> void f() {}
+template <template<class,class> class TT> void f() {}
--- /dev/null
+template <template<class,class> class TT, class T> void f(T)
+{
+}
+
+template <template<class> class TT, class T> void f(T)
+{
+}
+
+template <class T> class C {};
+template <class T,class U> class D {};
+
+int main()
+{
+ f<C>(1);
+ f<D>(1);
+}
--- /dev/null
+template <template<int> class TT, class T> void f(T)
+{
+}
+
+template <template<class> class TT, class T> void f(T)
+{
+}
+
+template <class T> class C {};
+template <int> class D {};
+
+int main()
+{
+ f<C>(1);
+ f<D>(1);
+}
--- /dev/null
+// Build don't link:
+
+template <int i> class C {};
+template <template <long> class TT> class D {};
+
+int main()
+{
+ D<C> d; // ERROR - args not match
+}
--- /dev/null
+template <class T, template <T> class TT> class C {};
+template <int> class D {};
+
+int main()
+{
+ C<int,D> c;
+}
--- /dev/null
+template<class E, int i, class F, class G=int, int j=i, class H=E> class D
+{
+};
+
+template<template<class,int,class,class> class D,class E> class C
+{
+ D<E,2,char,bool> d;
+};
+
+int main()
+{
+ C<D,int> c;
+}
--- /dev/null
+// Build don't link:
+
+template<class A,class B> class mymap {};
+
+template<class Key,
+ class Value,
+ template<class, class > class MapT>
+class base
+{
+
+};
+
+// specialization
+template<class Key, class Value>
+class base<Key, Value, mymap<int, int > > // ERROR - mymap<...> is not a template
+{ // ERROR - Bad class name
+
+};