2009-02-19 6 views
3

Comment faire une fonction wrapper qui appelle une autre fonction avec exactement le même nom et les mêmes paramètres que la fonction wrapper elle-même dans l'espace de noms global?C++ wrapper avec le même nom?

Par exemple j'ai dans A.h foo (int bar); et dans A.cpp son implémentation, et dans B.h foo (int bar); et dans B.cpp foo (barre int) {foo (barre)}

Je veux que le foo (barre) de B.cpp appelle A.h's foo (int barre), pas récursif lui-même.

Comment est-ce que je peux faire ceci? Je ne veux pas renommer foo.

Mise à jour:

A.h est dans l'espace global et je ne peux pas le changer, donc je suppose que l'aide est namespaces pas une option?

Mise à jour:

Namespaces résoudre le problème. Je ne savais pas que vous pouvez appeler la fonction espace de nommage global avec :: foo()

+0

Tant que B.h peut être modifié pour placer son foo() dans un espace de noms, vous pouvez toujours le faire. –

+0

namespaces n'est pas une option? Vous voulez que B utilise l'espace de nom de A à droite? et vous ne pouvez pas changer un espace de noms? Donc, quel est le problème, vous n'avez jamais besoin de changer A. Faites B appeler A :: foo() et si vous ne pouvez pas changer B alors theres rien à faire bc il semble que vous ne pouvez rien changer;) –

Répondre

3

est-ce que B hérite/met en œuvre A du tout?

Si oui, vous pouvez utiliser

 
int B::foo(int bar) 
{ 
    ::foo(bar); 
} 

pour accéder au foo dans l'espace de noms global

ou si elle ne hérite pas .. vous pouvez utiliser l'espace de noms B uniquement

 
namespace B 
{ 
int foo(int bar) { ::foo(bar); } 
}; 
4

utiliser un espace de noms

namespace A 
{ 
int foo(int bar); 
}; 
namespace B 
{ 
int foo(int bar) { A::foo(bar); } 
}; 

vous pouvez également écrire en utilisant l'espace de noms A; dans votre code, mais il est fortement recommandé de ne jamais écrire en utilisant l'espace de noms dans un en-tête.

+0

@ wrap-per - Vous mentionnez dans une édition que vous ne pouvez pas changer 'A', notez que cela peut toujours fonctionner si vous pouvez changer' B' pour être dans un espace de noms - B :: foo() doit simplement appeler foo() en utilisant ':: foo (bar) 'pour indiquer qu'il veut appeler foo() dans l'espace de noms global. –

1

C'est le problème que les espaces de noms tentent de résoudre. Pouvez-vous ajouter des espaces de noms aux foo's en question? Ensuite, vous avez un moyen de résoudre cela. Quoi qu'il en soit, vous rencontrerez des problèmes d'éditeur de liens si les deux sont dans un espace de noms global.

0

Comme mentionné ci-dessus, l'espace de noms est une solution. Cependant, en supposant que vous ayez ce niveau de flexibilité, pourquoi n'encapsulez-vous pas cette fonction dans des classes/structs?

1

Vous ne pouvez pas le faire sans utiliser les espaces de noms, en changeant le nom de l'une des fonctions, en changeant la signature ou en rendant l'un d'entre eux statique. Le problème est que vous ne pouvez pas avoir 2 fonctions avec le même nom mutilé. Il doit donc y avoir quelque chose qui les rend différents.

Questions connexes