add class TypeHasMakeInstance<T> to be the friend of T, so we can make MakeInstance private