仅为初始化器列表使用命名空间
using namespace just for initialiser list
我在初始化器列表中使用了很多命名空间,并且希望使用命名空间来减少冗长。然而,初始化器列表在构造函数大括号的范围之外,所以我必须使用将放在构造函数之外,并用它污染文件的其余部分。是否有一种方法来确定我想要的使用范围?而不是:
MyClass::MyClass() :
m_one(nsConstants::ONE),
m_two(nsConstants::TWO),
m_three(nsConstants::THREE)
{}
我想:
MyClass::MyClass() :
using namespace nsConstants;
m_one(ONE),
m_two(TWO),
m_three(THREE)
{}
_
你不能。该标准提供了一些不太好的替代方案:
// The stuff you want to use.
namespace foo { namespace bar {
class Frob {};
} }
现在,从最不污染到最污染。
typedef
使得在类定义的private
部分中编写别名成为可能:
// I)
class Schwarzschild {
typedef foo::bar::Frob FbFrob;
public: Schwarzschild () : a(FbFrob()), b(FbFrob()) {}
private: FbFrob a,b,c;
};
但你也可以使用全局单元,但有机会重命名它:
// II)
class Schwarzschild {
public: Schwarzschild ();
private: foo::bar::Frob a,b,c;
};
// cxx-file
typedef foo::bar::Frob FbFrob;
Scharzschild::Scharzschild() : a(FbFrob()) {}
您也可以别名命名空间:
// III)
namespace fb = foo::bar;
class Planck {
public: Planck () : a(fb::Frob()), b(fb::Frob()) {}
private: fb::Frob a,b,c;
};
或者您可以从其他名称空间中挑选符号,缺点是您的Frob
可能在您的翻译单元中与另一个Frob
发生冲突:
// IV)
using foo::bar::Frob;
class Mach {
public: Mach () : a(Frob()), b(Frob()) {}
private: Frob a,b,c;
};
为了完整起见,最污染的解是using namespace
。
// V)
using namespace foo::bar;
class Newton {
public: Newton () : a(Frob()), b(Frob()) {}
private: Frob a,b,c;
};
请注意,III, IV和V也可以限制在您的cxx文件中,就像schwarzschild的例子一样。
这显然不可能。在c++中不存在像"局部使用"这样的东西。因此,您必须坚持使用作用域操作符或使用using
。
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- C++ C++类中的命名空间降级
- 如何使用 soong 命名空间来有条件地编译模块
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- C++:在函数参数列表中使用或不使用命名空间
- 命名空间 std 中所有符号的列表
- 仅为初始化器列表使用命名空间