2010-02-05 16 views
11

tengo esta clase con un método de instancia llamado abierta y la necesidad de llamar a una función declarada en C también llamado abierta. Una muestra de la siguiente manera:Llamada en C++ una función no miembro dentro de una clase con un método con el mismo

void SerialPort::open() 
{ 
    if(_open) 
     return; 
    fd = open (_portName.c_str(), O_RDWR | O_NOCTTY); 
    _open = true; 
} 

Cuando intento compilar (usando GCC) me sale el siguiente error:

error: no matching function for call to 'SerialPort::open(const char*, int)' 

Incluí todas las cabeceras C requeridos. Cuando cambio el nombre del método, por ejemplo, open2, no tengo problemas para compilar.

¿Cómo puedo resolver este problema. Gracias de antemano.

+2

Como nota al margen, debe evitar comenzar sus nombres con "_". – Bill

+0

¿No ves por qué? Y es muy útil para las variables miembro. – jassuncao

+2

Es un punto del estándar: la mayoría de los identificadores que comienzan con '_' están reservados. La lista exacta es un poco complicada. Es algo así como: incluyendo 2 '_' consecutivos, comenzando por' _' seguido de una mayúscula, etc. ... y como no es probable que memorices la lista exacta, es mejor evitarla. –

Respuesta

33

Call

fd = ::open(_portName.c_str(), O_RDWR | O_NOCTTY); 

Los dos puntos dobles (::) antes de que el nombre de la función es C++ 's scope resolution operator:

If the resolution operator is placed in front of the variable name then the global variable is affected.

+0

Gracias por la respuesta rápida – jassuncao

+0

Pero eso no funciona si no sabe en qué espacio de nombres está abierto. Por ejemplo, si confía en el espacio de nombres del primer argumento para que el compilador encuentre el correcto. – PierreBdR

7

Write ::open en lugar de open. El prefijo :: indica que el nombre debe tomarse del alcance global. (? Espacio de nombres global no estoy seguro acerca de su significado exacto, para ser honesto ...)

3

añadir "::" antes open (_portName.c_str(), O_RDWR | O_NOCTTY);

0

Asegúrese de que:

1) Usted está utilizando resolución de espacio de nombres si la función de llamada y la función que se llama están en diferentes espacios de nombres, incluido el espacio de nombres principal

2) Si su función de llamada se define anteriormente, la función que se llama declara la función antes de la función de llamada. eg:

void bar(); 

void foo() 
{ 
    bar(); 
} 

void bar() 
{ 
.... 
} 
Cuestiones relacionadas