ネーミングスペースの使用と詳細


ネーミングスペースの使用と詳細について
昨日の夜、同級生が私に名前空間namespaceを話してくれました.話が終わったら、うん、自分が分かったと思っていました.今日はheritrixをseekdaで借りています.comでサイトに登っている間、C++のテンプレート(template)で書いてみようと思っていたのですが、なかなかやっていませんでした.今ちょうど実験に来られる時間があったので、実質的に同じ小さなプログラムを2つ書いてみました.この2つの小さなプログラムを通じて、後の一連の問題を引き起こし、同時に私の不足を暴露した.
最初のプログラムはこうです.
#include <iostream>
template <class T> 
inline const T max(T a,T b)
{
       return a>b? a:b;
}
int main()
{
    std::cout<<max(1,2);
    while(1);
    return 0;
}
テンプレートを使用する利点は言うまでもありませんが、この例からわかります.2つの整形数1,2の大きさを比較し,テンプレート関数の存在によりパラメータのタイプを予め定義することなく,浮動小数点数間の比較,さらには整形数と浮動小数点数の比較を行うことができる.これにより,従来のように関数のリロードを行う必要がなく,特定のパラメータタイプに対してもう1つの機能を書くのは同じであるが,パラメータの異なる額の関数だけで負担が大幅に軽減される.同時にtemplateは、1回のコンパイルですべてのパラメータタイプのコードを生成するのではなく、使用されるタイプに対してコンパイルされるので、テンプレート関数に遭遇したときにコンパイラがこの関数をコンパイルします.
OK、テンプレートのことについてはまずこれらを言って、次に私が今日出会った問題について話して、実は上のこの関数は最終的にデバッグしたプログラムで、事前に自分で書いたのはこのようなです:
#include <iostream>
using namespace std;
template <class T>
inline const T max(T a,T b)
{
       return a>b? a:b;
}
int main()
{
    cout<<max(1,2);
    while(1);
    return 0;
}
コンパイルエラー:C:Documents and SettingsAdministratorデスクトップtmpstl.cpp call of overloaded`max(int,int)'is ambiguousとは、max()に対して曖昧さが現れることを意味する.このようなエラーの原因は、stdのネーミングスペースを乱用したことにあります.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ネーミングスペースの出現は名前の衝突問題を解決するためである.C++のコードが多すぎるため、多くの人が彼のためにライブラリを書いたので、楊さんが挙げた例のように、科学計算ライブラリにはtimesという関数があり、倍乗演算を表す可能性がありますが、別のネットワーク通信ライブラリにはtimesという関数があり、現在の時間を取得することを示すことができます.では、この2つのライブラリを同時に含んでtimesを使用すると、コンパイル中にエラーが発生します.以前、人々がこの問題を解決する方法は、関数の前に接頭辞や接尾辞を付けて、関数に同名ではないことを保証することだったが、C++の壮大な発展に伴い、異なる関数名を取るだけで、衝突を解決する方法と言えるのだろうか.そこでネーミング空間が誕生した.私たちはあるクラスライブラリを書くときに彼に独自の空間名を決めました.では、この空間の内部の関数は、外部に彼と重複しているものがあっても、彼は唯一です.この空間の関数を外部で呼び出すには、ドメインオペレータだけで完了します.
例:
namespace net                  namespace calculate
{                                    {
int times                            int times
          {                                       {
           ...                                      ...
          }                                        }
}                                     }
使うときはnet::times()とcalculate::times()だけでいいです.しかし、私たちのプログラムでこれらのライブラリを使用するとき、これらの関数は依然としてグローバル関数です.ただ、彼の名前がある空間はグローバルではありません.つまり、彼の名前は他の同名関数に何の影響も与えません.
分割線で囲まれた部分は昨日の夜、楊が私に言ったネーミング空間に関する知識です.では、今から見てみましょう.私が書いた間違ったプログラムを見てみましょう.間違いが何によって引き起こされたのかが明らかになった.私はプログラムの冒頭にusing namespace stdを追加しました.コードで使用されるcoutオブジェクトはstdから来ているという意味ですが、stdにもmax()関数があるとは知りませんでした.max()関数を呼び出すと、stdにmax()関数があるため、自分で書いたものと衝突します.コンパイルエラーリストにも明確な説明があります:const_Tp&std::max(const_Tp&,const_Tp&)[with_Tp=int],幸い名前の衝突を最も原始的に解決する方法を考え出した:自分で書いた関数max()を個別の名前に変えて、水が死んだ...では、次にusing namespace stdをします.問題を取り除いて解決したのではないでしょうか.コンパイルしてみると、まだエラーが発生しています.エラーは、`cout'undeclared(first use this function)です.coutはstdネーミングスペースの下にあるオブジェクトなので、coutを使用する場合はstd::coutを使用する必要があります.再コンパイル実行、成功しました.では、std空間のmax()を使いたいならどうすればいいのでしょうか.簡単です.std::cout<自分のテンプレート関数にネーミングスペースを書き、ドメインオペレータでmax()関数を呼び出すこともできます.
#include <iostream>
namespace nero
{
template <class T>
inline const T max(T a,T b)
{
       return a>b? a:b;
}
}
int main()
{
    std::cout<<nero::max(1,2);
    while(1);
    return 0;
}
以上の文章はインターネットから転送され、http://zyb.nero.blog.163.com/blog/static/10860604520098249274225/ああ、ここで感謝します!