class-template-partial-spec2.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. template<typename T, typename 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, double> X1;
  17. TwoOptionTemplate<void *, wchar_t> X2;
  18. TwoOptionTemplate<long, long> X3;
  19. TwoOptionTemplate<int, int> X4;
  20. TwoOptionTemplate<long, long> SingleDest;
  21. TwoOptionTemplate<int, double> SecondDoubleDest;
  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. double 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, int> Y2;
  41. IntTemplateSpec<2, int> Y3;
  42. IntTemplateSpec<43, double> NumberDest;
  43. namespace One {
  44. namespace Two {
  45. namespace Three {
  46. template<class T>
  47. class Parent {};
  48. } // namespace Three
  49. } // namespace Two
  50. template<typename T, typename X>
  51. struct Child1: public Two::Three::Parent<unsigned> {
  52. char member;
  53. };
  54. template<class T>
  55. struct Child1<T, One::Two::Three::Parent<T>> {
  56. T member;
  57. };
  58. } // namespace One
  59. namespace Dst { One::Child1<double, One::Two::Three::Parent<double>> Z0Dst; }
  60. One::Child1<int, float> Z1;