6

クラス B はクラス A を継承します。クラス A には という名前の仮想関数がありbindます。

Class A {
  virtual void bind();
}

class B: public A {
  B();
}

B のコンストラクタでは、bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)関数 fromを使用します<sys/socket.h>

#include <sys/socket.h>

B::B () {
  int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  sockaddr_in server_addr, client_addr;
  if(sockfd < 0)
    perror("ERROR opening socket.\n");
  bzero((char*)&server_addr, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = INADDR_ANY;
  server_addr.sin_port = 2333;
  if(bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
    perror("ERROR on binding.\n");
  listen(sockfd, 1);
}

bindコンパイラは、2 つの関数が競合しているというエラーをスローします。bindinのラッパーを作成できることを知っていますsys/socket.h。競合を解決するエレガントで簡単な方法はありますか?

ありがとう

4

1 に答える 1

18

呼び出しを修飾するだけです。

if (::bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
//  ^^

これにより、グローバル名前空間で呼び出された関数を探すようにコンパイラに指示されbindます - 私はそれbind()がグローバル名前空間に存在すると仮定しています。そうでない場合は、スコープ解決演算子 ( ::) の前に存在する名前空間の名前を指定する必要があります。

于 2013-05-22T07:59:42.890 に答える