47724


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

[code]

     ///////////////////////テンプレート関数の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;
            }
    
[/code]


CC BY-SA 4.0
2018-08-22T06:37:51.200
47723
2018-08-23T10:56:57.427
2018-08-23T10:56:57.427
question
c++
c++,operator < がどこで使われてるか知りたい


以下の部分でしょうか。

[code]

    (106行目付近)Twin< Twin<int> > t1(  Twin<int>(36, 57), Twin<int>(23, 48)  );
    
[/code]

これは、「operator >」ではなくテンプレート引数の閉じカッコです。

[code]

    (読み替え)Twin<Twin<int>>     t1(Twin<int>(36, 57), Twin<int>(23, 48));
    
[/code]

ですね。  
ただし、こう書くとコンパイラの言語規格の対応状況によっては「>>」の部分が  
まさに「operator >>」と誤って解釈される場合があるため、スペースを入れていると思われます。


CC BY-SA 4.0
2018-08-22T06:56:27.977
47724
2018-08-22T06:56:27.977
3793
47723
answer


>
[code]

>            Twin< Twin<int> > t1(  Twin<int>(36, 57), Twin<int>(23, 48)  );
>  
[/code]

の行のことなら、この行で `operator>` は呼ばれていません。

`Twin< Twin<int> > t1;` をわかりやすく書き直すと

[code]

    typedef Twin<int> twin_int_type;
    Twin< twin_int_type > t1;
    
[/code]

さて `Twin<int>` に別名 `twin_int_type` をつけたわけですが、ここで

  * 「`Twin<int>` のコンストラクタは `int` ２つを引数にとる」
  * 「`Twin<twin_int_type>` のコンストラクタは `twin_int_type` ２つを引数にとる」

ということは理解できますか？（ここが `template` の基礎っす）

`Twin<int>(36, 57)` は無名な `Twin<int>` すなわち `twin_int_type` オブジェクトを１つ生成しています。  
`Twin<int>(23, 48)` も同様。

`t1` は `twin_int_type` ２つを引数にとるコンストラクタで初期化される必要があり、その引数が先ほどの２つの無名オブジェクトなわけです。


CC BY-SA 4.0
2018-08-22T07:00:29.257
47725
2018-08-22T07:08:08.060
2018-08-22T07:08:08.060
8589
8589
47723
answer