将嵌套类导入命名空间-C++
Import nested classes into namespace - C++
假设我有一个这样的类:
class A {
public:
class B {
// ...
};
static void f();
// ...
};
我可以将B
称为A::B
,将f()
称为A::f()
,但我能否将B
和f()
导入全局/当前命名空间?我试过
using A::B;
但这给了我一个编译错误。
这里有两个解决问题的方法:
1)B类:
typedef A::B B;
2)函数f():
inline void f()
{
A::f();
}
但在使用它们之前要三思。
编辑:在C++11中,您可以执行auto f = A::f;
,但这实际上会创建一个指向函数的指针,并且函数指针不能内联。
您应该能够为类使用命名空间别名:
using B = A::B;
但是,对于成员函数,甚至对于静态成员函数,都不能做到这一点。
编辑:根据这个SO答案(C++11中的"typedef"answers"using"之间有什么区别),这个应该是有效的,并且实际上以与typedef
相同的方式创建类型别名。然而,它只是C++11。
对于C++11中的静态成员函数,有一种变通方法,通过声明一个指向静态函数的变量:
struct Foo
{
static void bar()
{ }
};
auto bar = Foo::bar;
编辑:当然,在旧的C++标准中也可以使用指向静态成员函数的全局变量,但这比使用C++11的auto
关键字更麻烦。在上面的例子中,它将是:
void (*bar)() = Foo::bar;
您可以typedef
typedef A::B B;
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- C++ C++类中的命名空间降级
- 如何使用 soong 命名空间来有条件地编译模块
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何通过命名空间调用非静态方法
- 在命名空间名称之前加上 :: 是什么意思?