2013-05-22 2 views
5

Класс B наследует класс A. Класс A имеет виртуальную функцию с именем bind.конфликт имен функций в C++

Class A { 
    virtual void bind(); 
} 

class B: public A { 
    B(); 
} 

В конструкторе B, он использует bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) функции из <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. Я знаю, что я могу создать обертку для bind в sys/socket.h. Есть ли элегантные и более простые способы разрешения конфликта?

Благодаря

+1

вы должны попытаться :: Bind (sockfd, (структура SOCKADDR *) & server_addr, SizeOf (server_addr) для доступа к глобальной привязки –

+1

Подробнее о 'разрешения области видимости 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

@WeiHe, если это сработало, тогда вы должны принять ответ Энди :) –

+1

@WeiHe: Рад, что это помогло. Если это решает вашу проблему, пожалуйста, подумайте о том, чтобы отметить ответ, как принято, когда вам будет позволено :) –

Смежные вопросы