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;