4

驚くほど少しハッキングした後、Linuxボックスにlibc ++をインストールすることができました(libstdc ++には不足しているものがあるため)。残念ながら、同じ名前の関数が原因で、既存のコードの一部が壊れています。

通常、そして私が必要とする方法で、bind()はソケットに関連しています。ただし、libc ++には独自のbind()関数が付属しています。これは基本的にこれですが、それらを分離するための便利な名前空間がありません。マーフィーの法則に従って、コンパイラは間違った関数を使用しようとし、エラーを吐き出します。NetBeansは、実際にはsys / socket.hファイルを検索しているため、問題は発生しません。

したがって、両方の関数が基本的に私の制御の範囲を超えている場合、コンパイラ(clang ++)に、特定のヘッダーを検索し、その関数の他の場所を検索しないように指示するにはどうすればよいですか?

4

2 に答える 2

9

bind()from<WinSock2.h>std::bind()(使用していたusing namespace std;)の間に競合がありました。メソッド呼び出しの前に
追加したところ、機能しました。=>::bind()::bind()

于 2013-02-12T14:27:38.620 に答える
4

まず、これはマーフィーとは何の関係もないと思います。bind()テンプレートの選択はおそらくより良い一致だと思います。の宣言std::bind()は名前空間stdにありますが、少なくとも私が見ているヘッダーファイルのバージョンではです。ソースファイルにusingディレクティブが含まれている可能性はありますか?(その場合、あなたはあなたが求めたすべての苦痛に値する)

usingディレクティブがない場合、引数が完全に一致すれば、非テンプレートバージョンの方が一致するはずです。それでも問題が解決しない場合は、bind()から関数の転送関数を作成できます。たとえば、これが変換ユニットで定義されている唯一の関数であるとし<sys/socket.h>ましょう。つまり、インクルードのみで、は含まれません。このように、この関数が転送する関数を選択することはできず、を使用できます。avoid_conflict_bind()<sys/socket.h><functional>bind()avoid_conflict_bind()

于 2012-01-24T00:45:22.620 に答える