2012-04-05 5 views
9

Estoy utilizando la nueva biblioteca libcxx y tengo un código que llama a la función de socket bind(). El problema es que cuando escribo using namespace std; el compilador me da un error para el siguiente código:Código de compilación que utiliza la función de socket bind() con libcxx falla

int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr)); 

el error utilizando sonido metálico (acumulación SVN):

error: no viable conversion from '__bind<int &, sockaddr *, unsigned long>' to 'int' 
int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr)); 

creo que el problema es que using namespace std; trae la función std::bind() del encabezado <functional> al alcance (aunque el encabezado no está incluido). Como estoy usando una biblioteca de terceros que usa todo el espacio de nombres completo, no puedo cambiar fácilmente los nombres de las clases por nombres completamente calificados.

Me preguntaba si esto es un problema en la implementación de la biblioteca o si hay algunas reglas nuevas en C++ 11 que podrían romper un código antiguo que usa bind(). Se apreciaría cualquier sugerencia sobre esto.

Gracias

romana

+0

¿Qué quiere decir cuando dice que la biblioteca de terceros utiliza todo el espacio de nombres estándar? – Troubadour

+0

Quiero decir que tiene 'using namespace std;' en algunos de los archivos. –

+0

¿Presumiblemente solo en los archivos fuente y no en los encabezados? Eso no debería afectarte en absoluto. – Troubadour

Respuesta

27

Esto no es un problema en la aplicación de las bibliotecas. C++ 11 introdujo su propia función std::bind en namespace std, que se utiliza para vincular parámetros a funciones y admite un poco de programación de orden superior.

El motivo de tener namespace std es ayudar a evitar que las nuevas funciones y clases de la biblioteca causen cambios importantes en el código existente. La razón de esto es que todo tiene un nombre que comienza con std::, lo que evita las colisiones de nombres.

Sin embargo, si se escribe using namespace std; en su programa, que está exponiendo a posibles cambios de ruptura como éste, ya que la función libre bind y la función std::bind no puede necesariamente ser quitados ambigüedades.

Para solucionar esto, puede llamar al bind como ::bind para aclarar que está en el espacio de nombres global, o puede eliminar el using namespace std; en la parte superior del programa.

Espero que esto ayude!

+0

Muchas gracias ... ¡está funcionando genial! – RajibTheKing

+1

Finalmente entendí qué estaba pasando con bind no return int. – viktike

Cuestiones relacionadas