1

Linux ソケット API 用の C++ ラッパーを作成したいと考えています。ラッパーのメソッドは、API の基になる関数名と同じ名前にする必要があります。

しかし、たとえば bind() メソッドでは、Linux ソケット API のプレーンな C bind() 関数を使用しています。bind(mSocketDescriptor, (struct sockaddr *) &serv_addr, sizeof(serv_addr))API 関数の署名と互換性のあるものを呼び出します。私のコンパイラは Invalid arguments 'Candidates are: bool bind(int)'、どちらが私のメソッドを参照していると不平を言っていinline bool Socket::bind(int portno)ます。

Eclipse がラッパー関数を参照している理由と、これを行う Eclipse を禁止するにはどうすればよいですか?

4

2 に答える 2

2

グローバルスコープ修飾子を追加する必要があります。

::bind(mSocketDescriptor, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

スコープの解決により、コンパイラーが名前を探す場所が決まります。名前の前に名前空間やクラススコープを付けることができます(例socket_wrapper::socket::bind())。そして、システム機能が通常存在するグローバルスコープがあります。これらの関数の前にグローバルスコープ修飾子を付けることができる::bind()ため、コンパイラは同じ名前のローカルメソッドを使用しないことを認識しています。

std標準ライブラリのクラスと関数が配置されている名前空間もあります。標準ライブラリを使用する場合は、これらの名前の前にstd::(eg std::iostream, std::cout, std::string, std::vector<>, ...)を付けます。

于 2012-11-11T15:17:11.563 に答える
0

名前空間を使用してください。明示的に!

また、C呼び出しは、あなたの場合、::プレフィックス::bindで参照する必要があります

于 2012-11-11T15:17:46.317 に答える