Ant*_*Ant 7 c++ namespaces using list
我在初始化列表中有很多命名空间用法,并且希望使用using命名空间来减少详细程度.但是,初始化列表超出了构造函数括号的范围,因此我必须将使用放在构造函数外部并使用它污染文件的其余部分.有没有办法根据需要调整使用范围?而不是:
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 {};
} }
现在,从污染最轻到污染最重。
typedefprivate使得可以在类定义的一部分中写入该别名:
// 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 示例中一样。