2011-07-01 5 views
6

私はg ++ 4.6.0を使用して、以前のバージョンで正常にコンパイルされたC++コードをコンパイルしています。sys/sockets.hのbind()とstd :: bindを区別するにはどうすればいいですか?

if (bind(iControl, (struct sockaddr *) &sa, sizeof(sa)) == -1) 
    throw runtime_error ("bind"); 

ここで、iControlはソケットであり、saはstruct sockaddr_inです。

しかし、G ++ 4.6で、私は次のエラーを取得する:

comms.cpp:93:66: error: no match for ‘operator==’ in ‘std::bind(_Functor&&, _ArgTypes&& ...) [with _Functor = int&, _ArgTypes = {sockaddr*, long unsigned int}, typename std::_Bind_helper<_Functor, _ArgTypes>::type = std::_Bind<int(sockaddr*, long unsigned int)>]((* &((sockaddr*)(& sa))), (* &16ul)) == -0x00000000000000001’ 

comms.cpp:93:66:注:候補者は、次のとおりです。

についてのページ、可能な候補者の半分が続きます。

sys/sockets.hのバインド機能をstd :: bindと混同しているように見えます(functional)。 using namespace stdを削除するために、ソースファイル全体を書き直すことなく2つを明確にするにはどうすればよいですか?

+11

なぜ、 'using namespace std;'はあまりいい考えではないのですか?:-) –

+0

OpenCVを使うと、同様の問題が発生する可能性があります。 –

+1

@BoPersson私はなぜそれを発見したのかもしれません:Pしかし、このコードは私の前にあります。 –

答えて

18

グローバルにするには:::bind(...)としてください(すべての適切なヘッダーが含まれていることを確認してください)。

EDIT:これはあなたの古いコードのコンパイルをすることができますし、にstd::bindをもたらすものではありません

using std::cout; 
using std::endl; 
using std::string; 
// etc. 

:(私は@Bo Perssonのさんのコメントからアイデアを得た) 別の固体のオプションは以下のようにいくつかのusing <thing>using namespace std;を変更することですグローバル名前空間。

+0

今朝この問題が発生しました。この_Bind_helperはどこから来ていますか?なぜ、この文脈では "namespace std"を使用するのが悪いのですか? –

関連する問題