【问题标题】:Import nested classes into namespace - C++将嵌套类导入命名空间 - C++
【发布时间】:2012-07-23 17:53:45
【问题描述】:

假设我有这样的课程:

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

我可以将B 称为A::B 并将f() 称为A::f(),但是我可以将Bf() 导入到全局/当前命名空间吗?我试过了

using A::B;

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

【问题讨论】:

  • 是编译错误,“错误:‘A’不是命名空间”吗?
  • A::f() 不能这样做。
  • @iammilind 但您可以通过变通方法实现该行为。

标签: c++ namespaces


【解决方案1】:

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

1) B 类:

typedef A::B B;

2)函数f():

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

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

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

【讨论】:

  • 对于 typedefusing 解决方案,有什么想法让它即使在私有嵌套类中也能正常工作?
【解决方案2】:

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

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

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

【讨论】:

  • using B = A::B; 这不起作用。还有一点就是不能内联函数指针。
  • @SergeyK。使用 GCC 4.7.1 对我来说效果很好。但你对内联是正确的。
  • 1.cpp:9:7: 错误:使用 B = A::B 的“B”之前的预期嵌套名称说明符; (gcc.EXE (GCC) 4.8.0)
  • @SergeyK。实际上,using 关键字语法在 C++11 中是合法的。使用 GCC 编译时,您是否使用了 -std=c++11-std=c++0x 标志?
【解决方案3】:

你可以typedef

typedef A::B B;

【讨论】:

  • 你也可以在调用A::f()的全局命名空间中创建f()
猜你喜欢
  • 2012-02-19
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
相关资源
最近更新 更多