2013-05-22 106 views
5

B類繼承自A類.A類具有名爲bind的虛擬函數。C++中的函數名稱衝突

Class A { 
    virtual void bind(); 
} 

class B: public A { 
    B(); 
} 

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

編譯器拋出錯誤,指出兩個bind函數衝突。我知道我可以在sys/socket.h中爲bind創建包裝。有沒有優雅和簡單的方法來解決衝突?

感謝

+1

你應該嘗試::綁定(的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:很高興它幫助。如果這解決了您的問題,請考慮將答案標記爲已接受,當您允許時:) –