8

私は非常に大規模なプロジェクトに取り組んでいますが、1つのファイルで突然コンパイル時エラーが発生し、コンパイラはwinsock.hbind()の呼び出しが実際にはの呼び出しであると見なしているようstd::bind()です。インクルードファイルのどこかにusing namespace stdコードスニペットがあるようです。これらが使用されている場所を見つけてusing namespace std削除することもできますが、これを行うためのより良い方法があるのではないでしょうか。

4

2 に答える 2

26

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

于 2013-03-06T22:12:06.340 に答える
10

はい、これは残念です。http://gcc.gnu.org/ml/libstdc++/2011-03/msg00143.htmlで説明したように、正確に正しい引数タイプを使用しない限り、std::bindテンプレートの方が適しています。

問題は、ソケットbind()関数がこの署名を持っていることです。
int bind(int, const sockaddr*, socklen_t);
したがって、非constポインターを使用した例の呼び出しは、可変個引数テンプレートstd::bindがより適切であることがわかります。3番目の引数がsocklen_t以外の整数型の場合も、同じことが起こります。

最初の引数がとを使用して定義した「ソケットのような」場合はオーバーロードセットからstd::bind削除することで、このあいまいさを防ぐためにGCCに準拠する拡張機能を追加したため、コードはGCCで機能します。ただし、それは他の実装には役立ちません。std::bindis_integralis_enum

とにかく削除するのは良い考えですが、名前空間で定義された型(など)を使用する非修飾呼び出しは、引数依存のルックアップで見つけることができるusing namespace std;ため、完全に十分ではない場合があります。Jonathan Potterの答えは、正しい関数を確実に取得するための最良の方法です。それをとして認定します。bind()stdstd::size_tstd::bind::bind

于 2013-03-06T23:48:07.603 に答える