class-template-partial-spec1.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. template<typename T, class P>
  2. struct TwoOptionTemplate {};
  3. template<typename T>
  4. struct TwoOptionTemplate<T, char> {
  5. int member;
  6. };
  7. template<typename T>
  8. struct TwoOptionTemplate<T, double> {
  9. float member;
  10. };
  11. template<typename T>
  12. struct TwoOptionTemplate<T, T> {
  13. T** member;
  14. };
  15. TwoOptionTemplate<int, char> X0;
  16. TwoOptionTemplate<int, float> X1;
  17. TwoOptionTemplate<void *, wchar_t> X2;
  18. TwoOptionTemplate<long, long> X3;
  19. TwoOptionTemplate<float, float> X4;
  20. TwoOptionTemplate<long, long> SingleSource;
  21. TwoOptionTemplate<char, double> SecondDoubleSource;
  22. template<int I, class C>
  23. struct IntTemplateSpec {};
  24. template<class C>
  25. struct IntTemplateSpec<4, C> {
  26. C member;
  27. };
  28. template<int I>
  29. struct IntTemplateSpec<I, void *> {
  30. int member;
  31. static constexpr int val = I;
  32. };
  33. template<int I>
  34. struct IntTemplateSpec<I, double> {
  35. char member;
  36. static constexpr int val = I;
  37. };
  38. IntTemplateSpec<4, wchar_t> Y0;
  39. IntTemplateSpec<5, void *> Y1;
  40. IntTemplateSpec<1, long> Y2;
  41. IntTemplateSpec<3, int> Y3;
  42. //template<int I> constexpr int IntTemplateSpec<I, double>::val;
  43. IntTemplateSpec<42, double> NumberSource;
  44. static_assert(NumberSource.val == 42);
  45. namespace One {
  46. namespace Two {
  47. // Just an empty namespace to ensure we can deal with multiple namespace decls.
  48. }
  49. }
  50. namespace One {
  51. namespace Two {
  52. namespace Three {
  53. template<class T>
  54. class Parent {};
  55. } // namespace Three
  56. } // namespace Two
  57. template<typename T, typename X>
  58. struct Child1: public Two::Three::Parent<unsigned> {
  59. char member;
  60. };
  61. template<class T>
  62. struct Child1<T, One::Two::Three::Parent<T>> {
  63. T member;
  64. };
  65. } // namespace One
  66. One::Child1<int, double> Z0Source;
  67. // Test import of nested namespace specifiers
  68. template<typename T>
  69. struct Outer {
  70. template<typename U> class Inner0;
  71. };
  72. template<typename X>
  73. template<typename Y>
  74. class Outer<X>::Inner0 {
  75. public:
  76. void f(X, Y);
  77. template<typename Z> struct Inner1;
  78. };
  79. template<typename X>
  80. template<typename Y>
  81. void Outer<X>::Inner0<Y>::f(X, Y) {}
  82. template<typename X>
  83. template<typename Y>
  84. template<typename Z>
  85. class Outer<X>::Inner0<Y>::Inner1 {
  86. public:
  87. void f(Y, Z);
  88. };
  89. template<typename X>
  90. template<typename Y>
  91. template<typename Z>
  92. void Outer<X>::Inner0<Y>::Inner1<Z>::f(Y, Z) {}