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

C++ 将嵌套类导入命名空间-C++;,c++,namespaces,C++,Namespaces,假设我有一门课是这样的: class A { public: class B { // ... }; static void f(); // ... }; 我可以将B引用为A::B并将f()引用为A::f(),但是我可以将B和f()导入全局/当前命名空间吗?我试过了 using A::B; 但这给了我一个编译错误。你可以typedef typedef A::B B; 这里有两种解决问题的方法: 1)B类: typedef A::B B; 2

假设我有一门课是这样的:

class A {
public:
    class B {
        // ...
    };
    static void f();
    // ...
};
我可以将
B
引用为
A::B
并将
f()
引用为
A::f()
,但是我可以将
B
f()
导入全局/当前命名空间吗?我试过了

using A::B;

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

你可以
typedef

typedef A::B B;

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

1)B类:

typedef A::B B;
2)函数f():

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


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

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

using B = A::B;
但是,您不能使用成员函数,即使使用静态成员函数也不行

编辑:根据这一点,它应该是有效的,并以与
typedef
相同的方式实际创建类型别名。然而,它只是C++11


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

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

auto bar = Foo::bar;
<> > >编辑:当然,在旧的C++标准中也有指向全局成员函数的全局变量,但是比使用C++ 11的<代码> Audio/Cuth>关键字更麻烦。在上面的例子中,它将是:

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

编译错误是“error:'A'不是命名空间”?对于
A::f()
@iammilind,您不能这样做,但可以通过一种变通方法来实现该行为。您还可以在全局命名空间中创建
f()
,使用B=A::B调用
A::f()
这将不起作用。另一点是函数指针不能内联。@SergeyK。使用GCC 4.7.1,对我来说效果很好。但是关于内联,您是对的。1.cpp:9:7:错误:使用B=A::B在“B”之前需要嵌套名称说明符<代码>(gcc.EXE(gcc)4.8.0)
@SergeyK。实际上,在C++11中使用关键字语法是合法的。在使用GCC编译时,您是否使用了
-std=c++11
-std=c++0x
标志?对于
typedef
使用
解决方案,是否有任何想法使其即使与私有嵌套类一起工作?
void (*bar)() = Foo::bar;