Как разрешить функцию-член C ++ против функции C с тем же именем? - PullRequest
0 голосов
/ 09 декабря 2011

Я получил класс сервера в server.h:

namespace tcp{

     #include <sys/types.h>       
     #include <sys/socket.h>
     #include <netinet/in.h>
     #include <arpa/inet.h>
     #include <netdb.h>

     class Server{
     private:
           int listener; //socket fd 
     public:
     /* ...... */
           void run();
           int listen();
     /* ...... */
     }
}

В server.cpp:

usinge namespace tcp;

void Server::run(){
     /* ...do something to get socket for listening...*/
     listen();
     /* ...do something else...*/
}

int Server::listen(){
        if (listen(listener, 10) == -1){
                 perror("listen");
                 exit(3)
        }
}

Компилятор не может различить вызов Server :: listen () и системный вызов listen (). Мое решение - обернуть директивы #include в пространство имен std. Однако я не уверен, будет ли конфликтовать, если другие файлы содержат эти системные заголовки, или какие-то другие проблемы Любое предложение, кроме изменения имени?

Ответы [ 4 ]

3 голосов
/ 09 декабря 2011

Сначала вы должны удалить все #include из пространства имен tcp.Чтобы провести различие между прослушиванием класса и прослушиванием C, достаточно вызвать Server :: listen (или прослушать внутри функции-члена класса) и :: listen (или просто прослушать вне функции-члена класса) для функции listen C.

3 голосов
/ 09 декабря 2011

Префикс версии C с ::

т.е.

if (::listen(listener, 10) == -1) {
   ...
}

т.е. используя глобальное пространство имен.

3 голосов
/ 09 декабря 2011

Вы хотите ::listen(listener,10)

Это скажет компилятору взглянуть на глобальную область видимости.

2 голосов
/ 09 декабря 2011

Не следует связываться с пространством имен std.Просто напишите ::listen, чтобы сослаться на символ в глобальном пространстве имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...