2013-05-22 17 views
5

Klasy B dziedziczą z klasy A. Klasa A ma funkcję wirtualną o nazwie bind.Konflikt nazwy funkcji w C++

Class A { 
    virtual void bind(); 
} 

class B: public A { 
    B(); 
} 

W konstruktora B używa bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) funkcję z <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); 
} 

Kompilatory zgłaszają błędy, informując, że dwie funkcje są sprzeczne z bind. Wiem, że mogę utworzyć wrapper dla bind w sys/socket.h. Czy istnieją jakieś eleganckie i łatwiejsze sposoby rozwiązania konfliktu?

Dzięki

+1

należy spróbować :: bind (sockfd, (struct sockaddr *) & server_addr, sizeof (server_addr) aby uzyskać dostęp do globalnego wiążą –

+1

Więcej o 'rozdzielczość zakres podmiot gospodarczy http://en.wikipedia.org/wiki/Scope_resolution_operator – Cyclonecode

Odpowiedz

15

Wystarczy zakwalifikować połączenia:

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

to powie kompilator szukać funkcji o nazwie bind w globalnej przestrzeni nazw - Jestem zakładając, że bind() żyje w globalnej przestrzeni nazw; jeśli nie, należy podać nazwę obszaru nazw, w którym znajduje się przed operatorem zmiany zakresu (::).

+0

Dzięki, działa! –

+0

@ WeiHe jeśli zadziałało, powinieneś zaakceptować odpowiedź Andy'ego :) –

+1

@WeiHe: Cieszę się, że pomogło. Jeśli to rozwiąże Twój problem, rozważ oznaczenie odpowiedzi jako zaakceptowanej, kiedy będziesz mieć możliwość :) –