2013-02-18 7 views
2

В нашем огромном кодовом, в одном из включаемых файлов, мы имеем заявлениеКак я могу «отключить» класс?

using std::some_function 

Однако я хочу «не использование» some_function и использовать другую some_function. Я не могу изменить этот заголовок, потому что большая часть базы кода зависит от него.

Есть ли возможность сделать это?

+5

одно слово: рефакторинг – UmNyobe

+20

Нет, нет. И это, дети, вот почему вы не играете в эти трюки в заголовках. –

+1

Просто используйте полное имя другого 'some_function'. Поскольку он добавлен, вы должны быть в состоянии сделать это. –

ответ

3

не думаю есть. Вы должны поместить функцию в пространстве имен и квалифицировать его использование:

namespace MyNamespace 
{ 
    void some_function(); 
} 

//... 
MyNamespace::some_function(); 

Конечно, лучшее, что вы можете сделать, это удалить using директивы и исправить код - но я (к сожалению) понимаю, почему это не всегда вариант.

EDIT: Просто может быть, то using директива не существует из-за ленивости, но кто-то на самом деле хочет, чтобы вы дважды подумать, прежде чем реализовать ваши собственные some_function.

+0

Да, что я знаю. Моя функция уже находится в пространстве имен. Тем не менее, я не хочу повторять его, и я хочу использовать MyNamespace :: some_function без количественного определения его каждый раз. – Alex

+0

, так что вы хотите сделать ту же ошибку дважды? преуспевать. – UmNyobe

+4

@Alex Просто используйте пространство имен. Пространства имен существуют по какой-то причине. – juanchopanza

1

Зависит от того, что вы хотите от объема «неиспользования».

Если это область действия (в вашем собственном пространстве имен или даже лучше для функции), вы можете разместить using MyNamespace::some_function; в своей области.

Если это глобальный охват, то автор исходного заголовка отменил вас - по сути, они получили имя ::some_function, и они помешали вам использовать его для чего-либо еще. Они не должны были вытащить функцию std в глобальное пространство имен, но вам просто нужно жить с их ошибкой.

Предполагая, что вы не хотите делать ту же самую ошибку, которую вы сделали, вы хотите, чтобы «unuse» применялся к одному исходному файлу, вы не помещаете его в глобальную область заголовка самостоятельно. В этом случае вы можете#define some_function MyNamespace::some_function, но я не рекомендую его, потому что читатели/разработчики кода не ожидают, что они понимают, что имя в нижнем регистре фактически является макросом.

Если some_function является функцией (а не класс, как в названии), и вы дело только с одной перегрузкой (например void some_function(), то есть еще один уродливый обходной Добавить еще один параметр:.

static void some_function(int) { MyNamespace::some_function(); } 

Затем вы можете назвать его и получить версию MyNamespace. Но если вы наберете дополнительный текст (в данном случае 0), я должен подумать, что вы можете сделать это и ожидаемым образом: сделайте этот дополнительный текст MyNamespace:: или просто используйте другое имя.

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