2013-05-22 6 views
5

클래스 B는 클래스 A로부터 상속받습니다. 클래스 A에는 bind이라는 가상 함수가 있습니다. B의 생성자에서 C에서 함수 이름이 충돌 함

Class A { 
    virtual void bind(); 
} 

class B: public A { 
    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 기능 충돌을 말하는 오류가 발생합니다. bind에 대한 래퍼를 sys/socket.h에 만들 수 있다는 것을 알고 있습니다. 갈등을 해결할 수있는 우아하고 쉬운 방법이 있습니까?

감사

+1

당신은 시도해야 :: 바인드 (sockfd와, (구조체 SOCKADDR의 *) SERVER_ADDR,를 sizeof (SERVER_ADDR를) –

+1

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

답변

15

그냥 호출 자격 :

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

이 글로벌 네임 스페이스에 bind라는 함수를 찾기 위해 컴파일러를 말할 것이다 - 나는 bind() 글로벌 네임 스페이스에 살고 않는 가정 오전; 그렇지 않은 경우 범위 분석 연산자 (::) 앞에있는 네임 스페이스의 이름을 지정해야합니다.

+0

operator' 범위 해상도'에 대해 자세히 알아보기 글로벌 바인딩에 액세스 할 수 고마워, 작동 해! –

+0

@WeiHe 히 그러면 작동하면 앤디의 대답을 받아 들여야합니다. –

+1

@WeiHe : 도움이 된 것을 기쁘게 생각합니다. 이 방법으로 문제가 해결되면 허용 될 때 답변을 수락 한 것으로 표시하십시오. –