2012-07-25 18 views
20

说我有一个这样的类:导入嵌套类到名字空间 - C++

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

可以参考我BA::Bf()A::f(),但我可以导入Bf()融入全球/电流命名空间?我试过

using A::B; 

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

+4

编译错误,“错误:'A'不是一个命名空间”? – Johnsyweb 2012-07-25 10:10:40

+4

你不能为'A :: f()'做到这一点。 – iammilind 2012-07-25 10:14:32

+1

@iammilind,但您可以通过解决方法实现该行为。 – 2012-07-25 10:31:20

回答

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++ 11的auto关键字更加混乱。在上面的例子中,它将是:

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

''使用B = A :: B;''这不起作用。另一点是函数指针不能内联。 – 2012-07-25 10:48:52

+4

@SergeyK。对我来说工作得很好,使用GCC 4.7.1。但你对内联是正确的。 – 2012-07-25 10:51:59

+3

1.cpp:9:7:错误:预期的嵌套名称说明符在'B'之前 使用B = A :: B; ''(gcc.EXE(GCC)4.8.0)'' – 2012-07-25 10:52:40

8

可以typedef

typedef A::B B; 
+5

您也可以在调用'A :: f()'的全局名称空间中创建'f()'。 – 2012-07-25 10:30:53

32

以下是为您的问题,有两种解决方法:乙

1)类:

typedef A::B B; 

2)函数f():

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

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

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

+0

对于'typedef'或''使用'解决方案,任何想法使它甚至与私人嵌套类工作? – Dreamer 2017-02-11 01:05:35