xref: /Universal-ctags/Units/parser-cxx.r/template-specializations.d/input.cpp (revision fcc4853ec2f2b7a2992d8b64a77eb60d148b3c0d)
1 template<typename T>
2 struct A {
3     void f(T); // member, declared in the primary template
hA4     void h(T) {} // member, defined in the primary template
5     template<class X1> void g1(T, X1); // member template
6     template<class X2> void g2(T, X2); // member template
7 };
8 
9 // specialization of a member
10 template<> void A<int>::f(int);
11 // member specialization OK even if defined in-class
h(int)12 template<> void A<int>::h(int) {}
13 
14 // out of class member template definition
15 template<class T>
g1(T,X1)16 template<class X1> void A<T>::g1(T, X1) { }
17 
18 // member template specialization
19 template<>
20 template<class X1> void A<int>::g1(int, X1);
21 
22 // member template specialization
23 template<>
24 template<> void A<int>::g2<char>(int, char); // for X2 = char
25 // same, using template argument deduction (X1 = char)
26 template<>
27 template<> void A<int>::g1(int, char);
28 
m(X)29 template<typename X> void m(X)
30 {
31 }
32 
m(int)33 template<> void m<int>(int)
34 {
35 }
36 
m(A<int> a)37 template<> void m<A<int>>(A<int> a)
38 {
39 }
40 
41 // bug #2181
42 struct B { };
m(B)43 template<> void m<B>(B)
44 {
45 }
46 
m(char)47 template<> void m(char)
48 {
49 }
50 
51 #if HANDLE_BROKEN_INPUT
52 	// This is broken input. Should *not* be extracted.
53 	template <> void int<int>(int a);
54 #endif
55 
56 
57 // Examples from the "manual".
58 
59 // primary template
60 template<class T1, class T2, int I>
61 class C {};
62 
63 //partial specialization where T2 is a pointer to T1
64 template<class T, int I>
65 class C<T, T*, I> {};
66 
67 // partial specialization where T1 is a pointer
68 template<class T, class T2, int I>
69 class C<T*, T2, I> {};
70 
71 // partial specialization where T1 is int, I is 5, and T2 is a pointer
72 template<class T>
73 class C<int, T*, 5> {};
74 
75 // partial specialization where T2 is a pointer
76 template<class X, class T, int I>
77 class C<X, T*, I> {};
78