仅出于初始化列表而使用命名空间

7

我在初始化列表中使用了很多命名空间,并希望使用 using namespace 来减少冗长。但是初始化列表在构造函数大括号的作用域之外,因此我必须将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)
{}

_


1
这是什么编程语言?请适当标记。 - Tomasz Nurkiewicz
抱歉Tomasz,感谢您的评论。已编辑并添加了C++标签。 - Ant
1
为避免混淆,应称其为“ctor-initializer”,因为C++语法元素“initializer-list”是另一种东西(聚合初始化器中的{}之间的部分)。在文件的其他部分“污染”使用有什么不好?这是您的.cxx文件,而不是头文件,所以应该没问题。另一个选项是执行using nsConstants::ONE;,但您想要的是不可能的。 - PlasmaHH
嗨,PlasmaHH,我是一名程序员,而不是编译器编写者,因此我更喜欢使用用户范围内的语言,例如在C++ FAQ中。我认为这样会更准确。对于我的情况来说,污染是不可接受的,因为我正在使用命名空间来防止名称冲突。谢谢你的想法。 - Ant
2个回答

4

你无法这样做。标准提供了一些不太好的替代方案:

// 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;
};

为了完整起见,最污染的解决方案是使用命名空间
//  V)
using namespace foo::bar;
class Newton {
public:   Newton () : a(Frob()), b(Frob()) {}
private:  Frob a,b,c;
};

注意,III、IV和V也可以限制在你的cxx文件中,就像在Schwarzschild示例中一样。

谢谢您非常详尽的回答,phresnel。在我的命名空间中有很多类型,这意味着在I、II和IV中需要大量的额外代码。 III 缩短了命名空间,但在我的情况下已经很短了,而我想避免使用V。因此,在这种情况下,我将坚持我的原始代码。 - Ant

0

这显然是不可能的。在C++中不存在"本地使用"这样的东西。因此,您必须坚持使用作用域运算符或使用using


在C ++中没有所谓的“本地使用(local using)”。我的意思是:void myFunction() { using namespace nsConstants; i = ONE; }这是C ++中的代码。有关详细信息,请参见stackoverflow上的其他条目。(抱歉,我无法将其格式化为代码。) - Ant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接