We recommend that you do not use built-in types, but use classes such as: Do not use int, but use Int instead of unsigned. Use Unsigned ..... in this way, the so-called spam value scpp_types.h will not appear: [cpp] # ifndef _ SCCP_TYPES_H _ # define _ SCCP_TYPES_H _ # include <ostream> # include "scpp_assert.h" template <typename T> class TNumber {public: TNumber (const T & x = 0): data _ (x) {} operator T () const {return data _;} TNumber & operator = (const T & x) {data _ = x; return * this;} TNumber operator ++ (int) {TNu Mber <T> copy (* this); ++ data _; return copy;} TNumber operator ++ () {++ data _; return * this ;} TNumber & operator + = (T x) {data _ + = x; return * this;} TNumber & operator-= (T x) {data _-= x; return * this;} TNumber & operator * = (T x) {data _ * = x; return * this;} TNumber & operator/= (T x) {SCPP_ASSERT (x! = 0, "Attempt to divide by 0"); data _/= x; return * this;} T operator/(T x) {SCPP_ASSERT (x! = 0, "Attempt to divide by 0"); return data _/x;} private: T data _ ;}; typedef long int64; typedef unsigned long unsigned64; typedef TNumber <int> Int; typedef TNumber <unsigned> Unsigned; typedef TNumber <int64> Int64; typedef TNumber <unsigned64> Unsigned64; typedef TNumber <float> Float; typedef TNumber <double> Double; typedef TNumber <char> Char; class Bool {public: Bool (bool x = false): data _ (x) {} operator bool () const {return data _;} Bool & operator = (bool x) {data _ = x; return * this;} Bool & operator & = (bool x) {data _ & = x; return * this;} Bool & operator | = (bool x) {data _ | = x; return * this;} private: bool data _ ;}; inline std: ostream & operator <(std: ostream & OS, Bool B) {if (B) {OS <"True ";} else {OS <"False";} return OS;} test code (vs2012 + win7 environment): [cpp] # include "stdafx. h "# include" scpp_assert.h "# include" iostream "# include" scpp_vector.h "# include" scpp_array.h "# include" scpp_matrix.h "# include" algorithm "# include" handle "int _ tmain (int argc, _ TCHAR * argv []) {Int dataInt; Double dataDouble1 (1.2); Double dataDouble2; Char c; std: cout <dataInt <std: endl; std :: cout <dataDouble1 <std: endl; std: cout <dataDouble2 <std: endl; std: cout <dataInt ++ <std :: endl; std: cout <++ dataInt <std: endl; std: cout <c <std: endl; c = 'X'; std:: cout <c <std: endl; // dataDouble1/= dataDouble2; dataDouble1 = dataDouble1/dataDouble2; return 0 ;}