私は非常に大規模なプロジェクトに取り組んでいますが、1つのファイルで突然コンパイル時エラーが発生し、コンパイラはwinsock.hbind()
の呼び出しが実際にはの呼び出しであると見なしているようstd::bind()
です。インクルードファイルのどこかにusing namespace std
コードスニペットがあるようです。これらが使用されている場所を見つけてusing namespace std
削除することもできますが、これを行うためのより良い方法があるのではないでしょうか。
2 に答える
使用する呼び出しを変更して::bind()
、グローバル名前空間を指定できます。
はい、これは残念です。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::bind
is_integral
is_enum
とにかく削除するのは良い考えですが、名前空間で定義された型(など)を使用する非修飾呼び出しは、引数依存のルックアップで見つけることができるusing namespace std;
ため、完全に十分ではない場合があります。Jonathan Potterの答えは、正しい関数を確実に取得するための最良の方法です。それをとして認定します。bind()
std
std::size_t
std::bind
::bind