2013-05-22 24 views
5

La classe B eredita dalla classe A. La classe A ha una funzione virtuale denominata bind.conflitto di nomi di funzione in C++

Class A { 
    virtual void bind(); 
} 

class B: public A { 
    B(); 
} 

Nel costruttore di B, si utilizza bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) funzione dal <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); 
} 

compilatori genera errori dicendo che le due funzioni bind conflitto. So che posso creare un wrapper per bind in sys/socket.h. Esistono modi eleganti e semplici per risolvere il conflitto?

Grazie

+1

si dovrebbe provare :: bind (sockfd, (struct sockaddr *) & server_addr, sizeof (server_addr) per accedere legano globale –

+1

Leggi di più riguardo 'risoluzione portata operator' http://en.wikipedia.org/wiki/Scope_resolution_operator – Cyclonecode

risposta

15

Proprio qualificare la chiamata:

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

Questo dirà al compilatore di cercare una funzione chiamata bind nel namespace globale - Io parto dal presupposto che bind() abita nello spazio dei nomi globale; in caso contrario, è necessario specificare il nome dello spazio dei nomi in cui risiede prima dell'operatore di risoluzione dell'ambito (::).

+0

Grazie, funziona! –

+0

@WeiHe se funzionasse, allora dovresti accettare la risposta di Andy :) –

+1

@WeiHe: Sono contento che l'abbia aiutato. Se questo risolve il tuo problema, considera di contrassegnare la risposta come accettata quando ti sarà permesso di :) –