2013-05-22 7 views
5

クラスBはクラスAから継承します。クラスAにはbindという仮想関数があります。 Bのコンストラクタにおいて関数名はC++で競合します

Class A { 
    virtual void bind(); 
} 

class B: public A { 
    B(); 
} 

、それは<sys/socket.h>からbind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)関数を使用します。

#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); 
} 

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

おかげ

+1

あなたはグローバルバインドにアクセスするために:: bind(sockfd、(struct sockaddr *)&server_addr、sizeof(server_addr)) –

+1

'scope resolution operator'についてもっと読むhttp://en.wikipedia.org/wiki/Scope_resolution_operator – Cyclonecode

答えて

15

ジャストコール資格:

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

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

+0

ありがとう、それは動作します! –

+0

@ウェイもしそれがうまくいけばアンディの答えを受け入れる必要があります:) –

+1

@ウェイ:喜んで助けた。これがあなたの問題を解決するならば、あなたが許可されるときに回答を受け入れたものとしてマークすることを検討してください:) –

関連する問題