2010-02-05 3 views
11

J'ai cette classe avec une méthode d'instance nommée ouverte et besoin d'appeler une fonction déclarée en C aussi appelé ouvert. Suit un échantillon:Appel en C++ une fonction non membre à l'intérieur d'une classe avec une méthode avec le même

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

Lorsque je tente de le compiler (en utilisant GCC) Je reçois l'erreur suivante:

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

J'inclus tous les en-têtes C nécessaires. Quand je change le nom de la méthode par exemple open2 Je n'ai pas de problèmes de compilation.

Comment puis-je résoudre ce problème. Merci d'avance.

+2

En note, vous devriez éviter de commencer vos noms avec "_". – Bill

+0

Je ne vois pas pourquoi? Et c'est très pratique pour les variables membres. – jassuncao

+2

C'est un point de la norme: la plupart des identifiants commençant par '_' sont réservés. La liste exacte est un peu compliquée. Il va quelque chose comme: y compris 2 consécutifs '_', commençant par' _' suivi d'une majuscule, etc ... et puisque vous n'êtes pas susceptible de mémoriser la liste exacte, il est préférable de l'éviter. –

Répondre

33

Appel

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

Le double deux points (::) avant que le nom de la fonction est C++ 's scope resolution operator:

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

+0

Merci pour la réponse rapide – jassuncao

+0

Mais cela ne fonctionne pas si vous ne connaissez pas l'espace de noms ouvert. Par exemple, si vous comptez sur l'espace de noms du premier argument pour que le compilateur trouve le bon. – PierreBdR

7

Ecrire ::open au lieu de open. Le préfixe :: indique que le nom doit provenir de la portée globale. (? Espace de nom global Je ne suis pas certain de sa signification exacte, pour être honnête ...)

3

ajouter "::" avant open (_portName.c_str(), O_RDWR | O_NOCTTY);

0

Assurez-vous que:

1) Vous utilisez résolution de l'espace de noms si la fonction d'appel et la fonction appelée sont dans des espaces de noms différents, y compris l'espace de noms parent

2) Si votre fonction d'appel est définie ci-dessus, la fonction appelée appelle la fonction avant la fonction d'appel. Par exemple:

void bar(); 

void foo() 
{ 
    bar(); 
} 

void bar() 
{ 
.... 
} 
Questions connexes