2009-02-19 4 views
3

Как я могу сделать функцию-оболочку, которая вызывает другую функцию с точно такими же именем и параметрами, что и сама оболочка в глобальном пространстве имен?C++-оболочка с таким же именем?

Например, у меня есть A.h foo (int bar); и в A.cpp - его реализация, а в B.h foo (int bar); и в B.cpp foo (int bar) {foo (bar)}

Я хочу, чтобы foo (bar) B.cpp вызывал foo (int bar) A.h, а не сам рекурсивно.

Как я могу это сделать? Я не хочу переименовывать foo.

Update:

хиджры в глобальном пространстве имен, и я не могу изменить его, так что я думаю, с помощью пространств имен не вариант?

Update:

Namespaces решить эту проблему. Я не знаю, что вы можете вызвать глобальную функцию пространства имен с :: Foo()

+0

Пока B.h можно изменить, чтобы поместить его foo() в пространство имен, тогда вы все равно можете это сделать. –

+0

namespaces - это не вариант? Вы хотите, чтобы B правильно использовал пространство имен A? и вы не можете изменить пространство имен? поэтому в чем проблема, вам никогда не нужно менять A. Сделать B вызывать A :: foo(), и если вы не можете изменить B, тогда вам нечего делать bc, похоже, что вы ничего не можете изменить;) – 2009-02-19 15:14:37

ответ

3

Действительно ли B наследует/реализует A вообще?

В этом случае вы можете использовать

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

для доступа к Foo в глобальном пространстве имен

или если он не наследуется .. Вы можете использовать пространство имен на B только

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

использовать пространство имен

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

вы также можете написать с помощью пространства имен A; в вашем коде, но его настоятельно рекомендуется никогда не писать с использованием пространства имен в заголовке.

+0

@ wrap-per - Вы упомянули обратите внимание, что это может по-прежнему работать, если вы можете изменить 'B', чтобы быть в пространстве имен. B :: foo() просто нужно вызвать функцию foo(), используя' :: foo (bar) ', чтобы указать, что он хочет вызвать foo() в глобальном пространстве имен. –

1

Это проблема, которую пытаются решить пространства имен. Можете ли вы добавить пространства имен в рассматриваемый foo? Тогда у вас есть способ разрешить это. Во всяком случае, вы столкнетесь с проблемами компоновщика, если они оба находятся в глобальном пространстве имен.

0

Как упоминалось выше, пространство имен является одним из решений. Однако, предполагая, что у вас есть этот уровень гибкости, почему бы вам не инкапсулировать эту функцию в классы/структуры?

1

Вы не можете сделать это, не используя пространства имен, изменяя имя одной из функций, меняя подпись или ставя одну из них. Проблема в том, что у вас не может быть 2 функции с тем же измененным именем. Поэтому должно быть что-то, что делает их разными.

Смежные вопросы