将嵌套类导入命名空间-C++

Import nested classes into namespace - C++

本文关键字:命名空间 -C++ 导入 嵌套      更新时间:2023-10-16

假设我有一个这样的类:

class A {
public:
    class B {
        // ...
    };
    static void f();
    // ...
};

我可以将B称为A::B,将f()称为A::f(),但我能否将Bf()导入全局/当前命名空间?我试过

using A::B;

但这给了我一个编译错误。

这里有两个解决问题的方法:

1)B类:

typedef A::B B;

2)函数f():

inline void f()
{
    A::f();
}

但在使用它们之前要三思。

编辑:在C++11中,您可以执行auto f = A::f;,但这实际上会创建一个指向函数的指针,并且函数指针不能内联。

您应该能够为类使用命名空间别名:

using B = A::B;

但是,对于成员函数,甚至对于静态成员函数,都不能做到这一点。

编辑:根据这个SO答案(C++11中的"typedef"answers"using"之间有什么区别),这个应该是有效的,并且实际上以与typedef相同的方式创建类型别名。然而,它只是C++11。


对于C++11中的静态成员函数,有一种变通方法,通过声明一个指向静态函数的变量:

struct Foo
{
    static void bar()
        { }
};
auto bar = Foo::bar;

编辑:当然,在旧的C++标准中也可以使用指向静态成员函数的全局变量,但这比使用C++11的auto关键字更麻烦。在上面的例子中,它将是:

void (*bar)() = Foo::bar;

您可以typedef

typedef A::B B;