2012-01-24 8 views
4

驚くほど小さなハッキングの後、私はlibC++を自分のLinuxボックスにインストールすることができました(libstdC++には欠けているものがあります)。残念ながら、同じ名前の関数のため、既存のコードの一部が壊れています。libC++ - bind()の命名が競合していますか?

通常、必要な方法でbind()はソケットに関連します。しかし、libC++には基本的にはthisという独自のbind()関数が付いていましたが、便利な名前空間はありません。 Murphyの法則に従って、コンパイラは誤った関数を使用しようとし、エラーを吐き出します。 NetBeansはsys/socket.hファイルを実際に探しているので、問題はありません。

どちらの関数も基本的に私のコントロールの範囲を超えていますが、コンパイラ(clang ++)に特定のヘッダとその関数のどこにもないはずがないと教えてください。

+0

ディレクトリの順序とリンク順序が含まれます。このエラーはどの段階で発生しますか? –

+0

@honk私はディレクトリの順序とリンク順のすべての順列を、それを解決する可能性のあるオフチャンスで試しました。運がない。私が知る限り、 "-stdlib = libC++"コンパイラオプションは、ファイルで設定できるものよりも優先されます。 – DigitalMan

+1

libC++の 'bind()'は 'std'名前空間にあります。ソケットの 'bind()'はグローバル名前空間になければなりません。 'using namespace std;'をどこに使っていますか? – bames53

答えて

4

まず、これはMurphyとは関係ないと思います。bind()テンプレートの選択はおそらくもっと良い一致です。 std::bind()の宣言は、少なくとも私が見ているヘッダーファイルのバージョンでは、ネームスペースstdです。ソースファイルにusingディレクティブが含まれている可能性はありますか?引数が正確と一致した場合

何usingディレクティブが存在しない場合(この場合には、あなたがのために尋ねたすべての痛みに値する)、非テンプレートバージョンは良く一致する必要があります。これでも解決しない場合は、<sys/socket.h>からbind()関数の転送関数を作成することができます。<sys/socket.h>とします。つまり、<sys/socket.h>であり、<functional>ではなく、<sys/socket.h>となります。この方法では、この関数が転送するbind()関数の選択肢がないため、avoid_conflict_bind()を使用できます。私は(私はusing namespace std;を使用していた)<WinSock2.h>からbind()std::bind()の間に矛盾があった

+1

私は本当に 'namespace std;'をすべてのソースファイルに使用しています。 bind()をリダイレクトするスコープ外の関数を削除しようとします。 – DigitalMan

+5

個人的には、私はむしろすべてのソースファイルからusingディレクティブを削除しますが、この選択はあなたのものです。私はディレクティブを自分で使用しているわけではないので、私は少し曖昧ですが、 '** bind()'を使うとusingディレクティブでインポートされた名前を使用しないと思う**です。これは少し簡単かもしれません。私は**しかし、**ディレクティブを使用することを強くお勧めします!機能がどこから来たのかが不明瞭になっています。私は明示的な資格を使用しています(通常は名前空間のエイリアスを使用しています)。宣言が何を参照するのは簡単です。 –

+0

@DigitalMan:私は、「using namespace xxx;」に関するDietmar Kuhlの意見を二番目にしています。 1.タイプを完全に修飾する(関数はADLで取り上げるべきである)、2.型typedefを使って型を使用する、3.型付きの型(または関数)を対象の ' std :: string; '(例えば)を使います。4.名前のついた名前空間' namespace phx = boost :: phoenix; 'の名前空間エイリアスを使います。覚えておいてください、一般的にあなたのシンボルの可能な限りの範囲を取ろうとするべきです。 –

6


私は、メソッド呼び出しの前に::を追加し、それが働きました! bind() =>::bind()

関連する問題