2011-07-01 27 views
6

Estoy usando g ++ 4.6.0 para compilar algunos códigos C++ que se compilaron con éxito en versiones anteriores.¿Cómo distinguir entre bind() en sys/sockets.h y std :: bind?

if (bind(iControl, (struct sockaddr *) &sa, sizeof(sa)) == -1) 
    throw runtime_error ("bind"); 

donde iControl es un socket, y SA es una struct sockaddr_in.

Sin embargo, en g ++ 4.6 me sale el siguiente error:

comms.cpp:93:66: error: no match for ‘operator==’ in ‘std::bind(_Functor&&, _ArgTypes&& ...) [with _Functor = int&, _ArgTypes = {sockaddr*, long unsigned int}, typename std::_Bind_helper<_Functor, _ArgTypes>::type = std::_Bind<int(sockaddr*, long unsigned int)>]((* &((sockaddr*)(& sa))), (* &16ul)) == -0x00000000000000001’ 

comms.cpp: 93: 66: nota: los candidatos son:

seguido de aproximadamente una página y un medio de posibles candidatos .

Parece que está mezclando la función de vinculación en sys/sockets.h con std :: bind en functional. ¿Cómo desambiguo los dos sin volver a escribir todo el archivo fuente para eliminar using namespace std?

+11

¿Quieres saber por qué 'using namespace std;' no es una gran idea? :-) –

+0

Problemas similares pueden aumentar cuando utilizas OpenCV. –

+1

@BoPersson Pude haber descubierto por qué: P Pero este código es anterior a mí, en mi defensa. –

Respuesta

18

Califíquelo para que sea global: ::bind(...) (y asegúrese de tener todos los encabezados correctos incluidos).

EDIT: (me ocurrió la idea de hacer comentarios de @Bo Persson) Otra opción es cambiar sólida using namespace std; a varios using <thing> como:

using std::cout; 
using std::endl; 
using std::string; 
// etc. 

Esto le permite a su compilación de código antiguo y no trae en std::bind el espacio de nombres global.

+0

Estoy perdido aquí, habiendo tenido este problema esta mañana. ¿De dónde viene este _Bind_helper y por qué es "usar namespace std" algo malo en este contexto? –

Cuestiones relacionadas