Самая большая разница между ними состоит в том, что функция не может быть первой объявлена с помощью квалифицированного имени.
// 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() {}
Это самое важное различие между Думаю, два подхода. Но опять же, оба стиля имеют (разные) достоинства, так что любой из них будет работать, если мы будем последовательны.