Определить функцию внутри пространства имен или квалифицировать? - PullRequest
2 голосов
/ 13 июля 2020

Я вижу в нашей кодовой базе два стиля. Простой вопрос: что предпочесть?

void
someNsName::someFunc( int a, int b )
{/*...*/}

void
someNsName::someOtherFunc( int c )
{/*...*/}

или

namespace someNsName {
void
someFunc( int a, int b )
{/*...*/}

void
someOtherFunc( int c )
{/*...*/}
} // NS someNsName

Лично я предпочитаю последнее, особенно если в противном случае вам пришлось бы отбирать много из someNsName. Но есть ли еще причины?

1 Ответ

4 голосов
/ 13 июля 2020

Самая большая разница между ними состоит в том, что функция не может быть первой объявлена ​​с помощью квалифицированного имени.

// header
namespace foo {
    void bar(int);
}

// implementation
namespace foo {
    void bar(long) {
    } 
}

Я сделал ошибку в списке аргументов. Он объявляет перегрузку вместо задуманной мной функции. Проблема, скорее всего, будет обнаружена только во время связывания. Что не так уж плохо, но может потребоваться некоторое время, чтобы всплывающее окно действительно появилось. Если бы я написал реализацию как

void foo::bar(long) {
}

, при компиляции файла реализации произошла бы немедленная ошибка компилятора. Такой функции, ранее объявленной в foo, нет, поэтому я не могу ее определить.

Для длинных списков пространств имен всегда можно сделать

namespace impl = some::other::ns;

void impl::bar() {}

Это самое важное различие между Думаю, два подхода. Но опять же, оба стиля имеют (разные) достоинства, так что любой из них будет работать, если мы будем последовательны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...