#include #include template class A{ // The primary template class public: int a; S s; T t; A() : a{1}, s{}, t{} {}; }; template<> class A { // Complete specialization to S = int, T = string public: int a; int s; std::string t; A() : a{2}, s{}, t{}{}; }; template class A { // Partial Specialization to pointers public: int a; S s; // If S* is double, then S is the type double T t; A() : a{3}, s{}, t{}{}; }; template class A { // Partial specialization: T and S are the same types public: int a; T s; T t; A() : a{4}, s{}, t{}{}; }; int main(){ A a1; // Use of A A a2; // Use of A A a3; // Use of A A a4; // Use of A std::cout << a1.a << std::endl; // 1 std::cout << a2.a << std::endl; // 2 std::cout << a3.a << std::endl; // 3 std::cout << a4.a << std::endl; // 4 }