25

假设我有这样的课程:

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

我可以引用BasA::B和 to f()as A::f(),但我可以导入Bf()到全局/当前命名空间吗?我试过

using A::B;

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

4

3 回答 3

33

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

1) B 类:

typedef A::B B;

2)函数 f():

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

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

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

于 2012-07-25T10:35:20.443 回答
19

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

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++ 标准中也可以有一个指向静态成员函数的全局变量,但它比使用autoC++11 的关键字更混乱。在上面的示例中,它将是:

void (*bar)() = Foo::bar;
于 2012-07-25T10:41:05.363 回答
10

你可以typedef

typedef A::B B;
于 2012-07-25T10:09:50.273 回答