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

时间:2012-07-25 10:07:23

标签: c++ namespaces

说我有这样的课程:

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

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

using A::B;

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

3 个答案:

答案 0 :(得分:32)

以下是您的问题的两种解决方法:

1) B类:

typedef A::B B;

2)功能f():

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

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

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

答案 1 :(得分:16)

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

using B = A::B;

但是你不能用成员函数做到这一点,即使是静态成员函数也不行。

修改:根据this SO answer (What is the difference between 'typedef' and 'using' in C++11),此应该有效,并且实际上创建类型别名的方式与typedef相同。但是,它只是C ++ 11。


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

struct Foo
{
    static void bar()
        { }
};

auto bar = Foo::bar;

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

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

答案 2 :(得分:8)

你可以typedef

typedef A::B B;