<>問題点:拡張ライブラリ機能


<<汎用的な入出力----------coutの拡張>>この文章は一つの問題を引き起こした.
ライブラリ関数にはcout<<の「<<」オペレータが必要です.たとえばvectorのタイプのデータを出力する必要がありますが、標準ライブラリは実装されていません.自分で再ロードしてみましょう.しかし、ライブラリ関数に再ロードされたオペレータを見つけるにはどうすればいいですか?
これは問題です.C++では、すべての名前が使用される前に宣言しなければならないことを知っています.includeは単純な書き写しコードであり、つまり、私たちが再ロードした関数がライブラリ関数の後に現れるのは、私たちが述べた問題を実現できないのが常識です.もちろん、includeの前に前方宣言を簡単にすることができます.このスタイルはあまりよくありません.この宣言をヘッダファイルに書き込んで、後でこのヘッダファイルを最初に含めることができます.
これらのスキームはすべて実行可能であるが,不思議なことにタイトルに述べた文章に奇妙な問題が現れ,このリロード関数をnamespace stdに置くだけでよいので,説明できないが,再三のテストを経て,他の関数にはこのような特性はない.
ここ数日のテストを経て、実は他の関数も同様にこの特性を持っていることが分かった.見つからない場合は関連するネーミングスペースを検索し続け、関連する名前が見つかった場合は検索を停止します.関数パラメータが一致しなくても.すなわち、リロードメカニズムは、同じネーミング空間でのみ機能し、異なるネーミング空間、およびグローバル役割ドメインの間では機能しません.
上記のバグは、ヘッダファイルiteratorがネーミングスペースで「<<」を検索するとstdでしか検索できず、stdで既に見つかっているので検索を停止しますが、パラメータが一致しないためエラーを報告します.自分で拡張する関数をライブラリ関数に参照するには、stdに配置します.
小さなテストコードを貼り付けます.
#include<iostream>
#include<string>
using namespace std;

namespace std{

void Show()
{

}
template<class T>
void CallShow()
{
    //Show();
    //Show(std::string("empty"));
}

template<class T>
void CallShow(T s)
{
    //show();
    Show(s);
    //Show(std::string("empty"));
}

template<class T>
class display{

public:
    void CallShow(T s)
    {
        Show(s);
    }
};
}


namespace std{
void Show(int a)
{
    std::cout<<"Empty Show!"<<std::endl;
}

void Show(std::string s)
{
    std::cout<<"s = "<<s<<std::endl;
}
}

int main()
{
    CallShow<int>();
    std::string str = std::string("song");
    CallShow(str);    
    
    display<std::string> d;
    d.CallShow(str);
    //Show(str);
}
  ,        。
#include<iostream>
#include<string>
using namespace std;

namespace std{

void Show()
{

}
template<class T>
void CallShow()
{
    //Show();
    //Show(std::string("empty"));
}

template<class T>
void CallShow(T s)
{
    //show();
    Show(s);
    //Show(std::string("empty"));
}

template<class T>
class display{

public:
    void CallShow(T s)
    {
        Show(s);
    }
};
}



void Show(int a)
{
    std::cout<<"Empty Show!"<<std::endl;
}

void Show(std::string s)
{
    std::cout<<"s = "<<s<<std::endl;
}


int main()
{
    CallShow<int>();
    std::string str = std::string("song");
    CallShow(str);    
    
    display<std::string> d;
    d.CallShow(str);
    //Show(str);
}
プログラムのコンパイルに失敗しました.
このプログラムは、テンプレートクラスのインスタンス化と名前の使用前に宣言しなければならない言語特性にも関連しています.
この文はただ問題を引き出して、後で解決します!