说我有一个这样的类:导入嵌套类到名字空间 - C++
class A {
public:
class B {
// ...
};
static void f();
// ...
};
可以参考我B
为A::B
和f()
为A::f()
,但我可以导入B
和f()
融入全球/电流命名空间?我试过
using A::B;
但这给了我一个编译错误。
说我有一个这样的类:导入嵌套类到名字空间 - C++
class A {
public:
class B {
// ...
};
static void f();
// ...
};
可以参考我B
为A::B
和f()
为A::f()
,但我可以导入B
和f()
融入全球/电流命名空间?我试过
using A::B;
但这给了我一个编译错误。
您应该能够使用命名空间别名的类:
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;
''使用B = A :: B;''这不起作用。另一点是函数指针不能内联。 – 2012-07-25 10:48:52
@SergeyK。对我来说工作得很好,使用GCC 4.7.1。但你对内联是正确的。 – 2012-07-25 10:51:59
1.cpp:9:7:错误:预期的嵌套名称说明符在'B'之前 使用B = A :: B; ''(gcc.EXE(GCC)4.8.0)'' – 2012-07-25 10:52:40
可以typedef
typedef A::B B;
您也可以在调用'A :: f()'的全局名称空间中创建'f()'。 – 2012-07-25 10:30:53
以下是为您的问题,有两种解决方法:乙
1)类:
typedef A::B B;
2)函数f():
inline void f()
{
A::f();
}
但在使用它们之前请三思。
编辑:在C++ 11中,你可以做auto f = A::f;
但这实际上创建了一个指向函数的指针,而函数指针不能被内联。
对于'typedef'或''使用'解决方案,任何想法使它甚至与私人嵌套类工作? – Dreamer 2017-02-11 01:05:35
编译错误,“错误:'A'不是一个命名空间”? – Johnsyweb 2012-07-25 10:10:40
你不能为'A :: f()'做到这一点。 – iammilind 2012-07-25 10:14:32
@iammilind,但您可以通过解决方法实现该行为。 – 2012-07-25 10:31:20