2013-03-06 8 views
5

私は非常に大きなプロジェクトで作業しています。あるファイルでは、コンパイル時にエラーが発生しました。コンパイラは、winsock.h bind()は実際にはstd::bind()への呼び出しです。インクルードファイルのどこかにusing namespace stdコードスニペットがあるようです。私たちは、これらのusing namespace stdが使用されている場所を見つけて削除することができますが、これを行うにはより良い方法がありますか?std :: bindとwinsock.hバインドの混乱

+0

名前空間は楽しいものではありませんか? –

+4

いいえ、削除してください。 – inf

+2

'using namespace std'を削除してください。そうしないと別の名前で将来同じ問題が発生します。理由を説明するために – juanchopanza

答えて

15

::bind()を使用するように呼び出しを変更して、グローバル名前空間を指定することができます。

7

はい、これは残念です。

問題はソケットバインド()関数は、この署名を持っていることである:そう
int bind(int, const sockaddr*, socklen_t);
で呼び出し私はhttp://gcc.gnu.org/ml/libstdc++/2011-03/msg00143.htmlで説明したように、あなたが正確に右引数の型を使用しない限りstd::bindテンプレートが良く一致しています非constポインタを使用する例では、 可変長テンプレートstd :: bindがよりよく一致することがわかります。第3引数がsocklen_t以外の整数型の場合は、同じことが に起こります。

私は最初の引数は「ソケット状」、私はis_integralを使用して定義されているとあれば、過負荷セットからstd::bindを削除することによって、この曖昧さを防ぐために、GCCのstd::bindに準拠した拡張機能を追加しましたので、あなたのコードは、GCCで動作しますis_enum。しかし、それは他の実装では役に立ちません。 using namespace std;を削除

はとにかく良いアイデアですが、たまたまbind()への非修飾呼び出しがまだ引数依存の照合によりstd::bindを見つけることができる、名前空間std(例えばstd::size_tなど)で定義された型を使用するので、完全には十分ではないかもしれません。ジョナサン・ポッターの答えは、適切な機能を確実に得るための最善の方法です:::bindとしてください。

+0

+1 –