参考書は明解C++中級の本324ページです。
テンプレート関数について勉強していますがコード
operator > 演算子がどこでどのように使われているかがわかりません、
コメントにして実行してみた結果sort()のあたりで比較できないとのエラーが出たので
わかったのですがどのような原因でエラー出たのでしょうか?

 ///////////////////////テンプレート関数のIntTwin.cpp////////////////////////
            #ifndef ___class_Twin
        #define ___class_Twin
        #include <ostream>
        #include <utility>
        #include <algorithm>

        template<class type>class Twin {
        private:
            type v1;
            type v2;

        public:

            /*コンストラクタ*/
            Twin(const type& f = type(),const type& s = type()) :  v1(f),v2(s) { }

            /*コピーコンストラクタ*/
        //  Twin(const Twin<type>& t) : v1(t,first()),v2(t.second()){ }

            type first()const {
                return v1;
            }

            type& first() {
                return v1;
            }

            type second()const {
                return v2;
            }

            type& second() {
                return v2;
            }


            void set(const type& f, const type& s) {
                v1 = f;
                v2 = s;
            }

            type min()const {
                return v1 < v2 ? v1 : v2;
            }

            bool ascending()const {
                return v1 < v2;
            }

            void sort() {
                if ( (v1 < v2) != true ) {
                    std::swap(v1,v2);
                }
            }
        };


        /*挿入子*/
        template<class type> inline std::ostream& operator<<(std::ostream& os, const Twin<type>& t) {
            std::cout << "debug_Twin<type> ";
            return os << "[" << t.first() << "," << t.second() << "]";
        }



        #endif;



 ////////////////////////////main.cpp/////////////////////////////////////

            #include "conio.h"
        #include <new>
        #include <string>
        #include <iostream>
        #include "IntTwin.h"
        using namespace std;


        template<> inline ostream&  operator << (ostream& os, const 
          Twin<string>& st)
        {
            cout << "debug_Twin<string>";
            return os << "[\"" << st.first() << "\""",""\""<< st.second() << 
            "\"]";
        }

        template <class type> bool operator < (const Twin<type>& a, const nTwin<type>& b)
        {

            if ( a.first() < b.first() ) {
                return true;
            }
            else if ( !(b.first() < a.first()) && (a.second() < b.second()) ) {
                return true;//false
            }

            return false;//true
        }

    //////////////////////////main関数//////////////////////////

        int main() {

            Twin< Twin<int> > t1(  Twin<int>(36, 57), Twin<int>(23, 48)  );
            cout << "t1 = " << t1 << "\n";

            Twin< Twin<string > > t2( Twin<string>("ABC","XYZ"),Twin<string>("ABC", "ZZZ") );
            cout << "t2 = " << t2 << "\n";

            cout << "t2の値を変更しています\n";
            cout << "新しい第1値の第1値:"; cin >> t2.first().first();
            cout << "新しい第1値の第2値:"; cin >> t2.first().second();
            cout << "新しい第2値の第1値:"; cin >> t2.first().first();
            cout << "新しい第2値の第1値:"; cin >> t2.first().second();


            if (!t2.ascending()) {
                cout << "第一値<第二値が成立しませんのでソートします。\n";
                t2.sort();              // 第一値 < 第二値となるようにソート
                cout << "t2は" << t2 << "に変更されました。\n";
            }



            _getch();
            return 0;
        }