在命名空间内定义函数还是限定函数?

Bor*_*rph 2 c++ namespaces

我在我们的代码库中看到了两种风格。简单的问题:更喜欢什么?

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

void
someNsName::someOtherFunc( int c )
{/*...*/}
Run Code Online (Sandbox Code Playgroud)

或者

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

void
someOtherFunc( int c )
{/*...*/}
} // NS someNsName
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢后者,尤其是当您必须从someNsName其他方面获得很多资格时。但还有更多原因吗?

Sto*_*ica 5

两者最大的区别是函数不能用限定名声明。

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

// implementation
namespace foo {
    void bar(long) {
    } 
}
Run Code Online (Sandbox Code Playgroud)

我在参数列表中犯了一个错误。它声明了一个重载而不是我想要的函数。只有在链接期间才有可能发现问题。这还不错,但仍然需要一些时间才能真正弹出。我是否将实现编写为

void foo::bar(long) {
}
Run Code Online (Sandbox Code Playgroud)

编译实现文件时会立即出现编译器错误。之前没有在 中声明过这样的函数foo,所以我无法定义它。

对于长命名空间列表,你总是可以做到的

namespace impl = some::other::ns;

void impl::bar() {}
Run Code Online (Sandbox Code Playgroud)

我认为这是两种方法之间最重要的区别。但同样,两种风格都有(不同的)优点,所以只要我们一致,任何一种都可以。