13

新しいlibcxxライブラリを使用していて、ソケット関数を呼び出すコードがありますbind()。問題は、入力using namespace std;すると、コンパイラが次のコードのエラーを表示することです。

int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr));

clang(svn build)を使用したエラー:

error: no viable conversion from '__bind<int &, sockaddr *, unsigned long>' to 'int'
 int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr));

using namespace std;問題は、関数std::bind()をヘッダー<functional>からスコープに持ってくることだと思います(ヘッダーは含まれていませんが)。名前空間std全体を使用するサードパーティのライブラリを使用しているため、クラス名を完全修飾名に簡単に変更することはできません。

これがライブラリの実装の問題なのか、それともを使用する古いコードを壊す可能性のある新しいルールがC++11にあるのか疑問に思いましたbind()。これについての考えをいただければ幸いです。

ありがとう

ローマ人

4

1 に答える 1

37

これは、ライブラリの実装では問題になりません。C ++ 11は、独自のstd::bind関数をに導入しましたnamespace std。これは、パラメーターを関数にバインドし、少し高次のプログラミングをサポートするために使用されます。

持っている理由namespace stdは、新しいライブラリ関数とクラスが既存のコードに重大な変更を引き起こすのを防ぐのを助けるためです。これは、すべてに。で始まる名前が付いているため、std::名前の衝突を防ぐことができます。

ただし、プログラムに書き込むと、free関数と関数が必ずしも明確になるとは限らないためusing namespace std;、このような潜在的な重大な変更にさらされることになります。bindstd::bind

これを修正するには、bindasを呼び出して、それがグローバル名前空間にあることを明確にするか、プログラムの上部にあるを::bind削除します。using namespace std;

お役に立てれば!

于 2012-04-05T20:23:30.030 に答える