1 // CWG 150: Matching of template template-arguments excludes compatible 2 // templates 3 // { dg-options -fnew-ttp-matching } 4 5 template<class T> class A { /* ... */ }; 6 template<class T, class U = T> class B { /* ... */ }; 7 template<template<class> class P> class X { /* ... */ }; 8 X<A> xa; // OK 9 X<B> xb; // OK since P0522R0 10 11 #if __cpp_variadic_templates 12 template <class ... Types> class C { /* ... */ }; 13 template<template<class ...> class Q> class Y { /* ... */ }; 14 X<C> xc; // OK since P0522R0 15 Y<A> ya; // OK 16 Y<B> yb; // OK 17 Y<C> yc; // OK 18 #endif 19 20 #if __cpp_template_auto 21 template<auto n> class D { /* ... */ }; 22 template<template<int> class R> class Z { /* ... */ }; 23 Z<D> zd; // OK 24 #endif 25