2013-05-22 27 views
5

Sınıf B Sınıf A'dan miras alır. Sınıf A, bind adlı sanal bir işleve sahiptir. B yapıcısında işlev adları çakışması C++

Class A { 
    virtual void bind(); 
} 

class B: public A { 
    B(); 
} 

, bu <sys/socket.h> den bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) fonksiyonunu kullanır.

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

Derleyiciler iki bind fonksiyonları çatışma söyleyerek hatalarını atar. sys/socket.h'da bind için bir sarıcı oluşturabileceğimi biliyorum. Çatışmayı çözmek için herhangi bir zarif ve kolay yol var mı?

Teşekkür

+1

sen denemelisiniz :: bağlama (sockfd, (sockaddr yapı *) & Server_Addr, sizeof (Server_Addr) –

+1

http://en.wikipedia.org/wiki/Scope_resolution_operator – Cyclonecode

cevap

15

Sadece ara nitelemek:

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

Bu genel ad bind denilen bir işlev aramaya derleyici söyleyecektir - Ben bind() genel ad yaşıyor olduğunu varsayıyorum; Eğer değilse, o zaman alan çözünürlüğü operatörünün (::) önce bulunduğu ad alanının adını belirtmelisiniz.

+0

operator' kapsam çözünürlük 'hakkında daha fazlasını okuyun küresel bağlama erişmek için Teşekkürler, işe yarıyor! –

+0

@WeiHe işe yaradıysa o zaman Andy'nin cevabını kabul etmelisiniz :) –

+1

@WeiHe: Sevindim yardımcı oldu. Bu, sorununuzu çözerse, lütfen izin verildiğinde yanıtı kabul edildi olarak işaretlemeyi düşünün :) –