2017-06-21 85 views
3

这里有一个代码片段来演示我的问题。C++使用枚举声明:如何导入所有的枚举项?

namespace N{ 
    enum E { A, B, C, D }; 
} 

int main(){ 
    using N::E; 
    E e = A; // syntax error: 'A' is not declared 
} 

最后一行给我一个语法错误。我想在名称空间限定符N::的主函数中使用名称N::A,N::B,N::CN::D。但我想要做以下两件事情

(1)我不想说using namespace N,因为这会在N.进口一切

(2)我不对于枚举的每个成员,都不要说using N::Ausing N::B等。因为那么如果我想修改枚举,我将不得不改变我的主要功能。更不用说额外的输入是繁琐和容易出错的。

我试着自己寻找答案,但不能。任何帮助表示赞赏。

回答

6

如果你能改变E定义页眉,尝试一个inline namespace

namespace N { 
    inline namespace Enums { 
     enum E { A, B, C, D }; 
    } 
} 

int main() { 
    using namespace N::Enums; 
    E e = A; 
} 

所有的内嵌命名空间中的名称是可见的封闭命名空间N仿佛内嵌命名空间是不存在的,但是这可以导入所有的名字和你想要的名称。

+0

现在很聪明! –

+0

@aschelpler您的答案似乎是解决我的问题。我想知道'inline'关键字对命名空间的作用。我试图编译没有内联的代码,并且工作得很好。 – HazySmoke

+1

没有'inline',你不能在没有使用指令的上下文中说'N :: E'或'N :: A'。我想你不想强迫大家使用它。 – aschepler

0

使用限定名称

E e = E::A; 

例如

namespace N { 
    enum E { A, B, C, D }; 
} 

int main() 
{ 
    using N::E; 
    E e = E::A; 

    return 0; 
} 
+0

@Amadeus我猜他不想使用名称空间的名称与枚举。 –

+0

@Amadeus他犯了一个错字。 E不是命名空间。:) –

+1

感谢Amadeus。我也会这样说。我想知道在我的问题中除了我提到的(1)和(2)之外是否有其他方法。 – HazySmoke