1

这两个声明有什么区别?

class foo
{
public:
    static void bar();
};

namespace foo
{
    void bar();
}

在我看来,没有,因为barinclass foo无权访问thisbarin namespace也无权访问foo

当然,这纯粹是理论上的。

4

2 回答 2

7

公共静态类成员函数和在命名空间中声明的全局函数有什么区别?

  • 类成员函数将能够访问类的私有静态成员,而命名空间内的函数将不会直接具有任何类型的数据保护
  • 正如@ValarDohaeris所指出的,您甚至可以在对象上下文中创建类对象foo并调用obj.bar(),而命名空间则无法实现相同的目标,因为没有命名空间的实例
  • 可以通过有效调用导入命名空间usingbar()
  • 正如@John5342foo所述,您可以在模板参数处使用该类。例如在template<typename T> fun() { T::bar(); }
于 2013-04-27T13:05:54.217 回答
7

在命名空间范围内定义的函数可以通过参数相关查找找到:

namespace foo
{
    class bar;
    void baz (bar);
}

foo::bar x;
baz (x); // Ok, baz is found by ADL

如果 foo 是一个类而不是命名空间,这不起作用。

于 2013-04-27T13:23:05.693 回答