不同文件中同一命名空间中2个不同枚举中的相同标识符

时间:2015-01-05 08:59:45

标签: c++

我在两个不同的文件中使用相同的命名空间。 在那些文件中,我有2枚枚举。 我需要在这些枚举中使用相同的标识符。 有办法吗?

在第一个文件中 first.h

...
namespace foo
{
 enum direction
 {
   NONE, 
   RIGHT    
   ...
 }
}

In second file
second.h

...
namespace foo
{
 enum reverse
 {
   NONE,  
   LEFT,   
   ...
 }
}

这是一个示例代码。 我需要重用“NONE”。 我需要visual studio 2008的代码。 (不能使用:枚举类)

4 个答案:

答案 0 :(得分:5)

如果你可以使用C ++ 11,那么实现你想要的最好方法是使用“强类型枚举”,使用enum class关键字声明,即

enum class direction
{
    NONE,
    LEFT
};

enum class reverse
{
    NONE,
    RIGHT
};

在其余代码中,您可以将枚举数称为ns::direction::NONEns::reverse::NONE(如果您熟悉该语言,则与C#一样)。

如果您没有可用的C ++ 11,那么您可以通过在内部命名空间中声明匿名枚举来模拟相同的事情,例如

namespace direction {
     enum {
         NONE,
         LEFT
     };
}

namespace reverse {
    enum {
        NONE,
        RIGHT
    };
}

然后,您再次引用direction::NONEreverse::NONE,这样就没有冲突。

答案 1 :(得分:1)

您可以使用

direction::NONE

reverse::NONE

区分枚举数,前提是枚举是在不同的范围内定义的。否则,编译器将发出重新定义枚举数的错误。

这是一个例子

#include <iostream>

enum A { NONE };

namespace N1
{
    enum B { NONE = 1 };
}

int main() 
{
    enum C { NONE = 2 };

    std::cout << A::NONE << '\t' << N1::NONE << '\t' << NONE << std::endl;

    return 0;
}

输出

0   1   2

答案 2 :(得分:1)

#include <iostream>
#include "first.h"

namespace second
{
    #include "second.h"
}

using namespace std;

int main()
{
    cout << foo::NONE << " " << second::foo::NONE << endl;

    return 0;
}

答案 3 :(得分:0)

不,您不能将值从一个枚举重用到另一个枚举。

这可能不是正确的解决方案,但您可以使用显式枚举值,例如:

 enum ... 
 {
    NONE = 0,
    ...
 };

或依赖于从0开始的编译器,并为每个枚举计数一个(假设没有赋值)。

然而,它们仍然不是相同的枚举类型,我认为你应该考虑另一种解决方案。从你的问题中你并不完全清楚你实际上想要实现什么,但听起来你正试图制造一个反向控制&#34;,左边变成右边和右边变成左边等等。我建议使用getter函数执行类似这样的操作:

direction GetDirection()
{
    if (reverse)
    {
       switch(curDirection) 
       {
          case LEFT:
              return RIGHT;
          case RIGHT:
              return LEFT;
         ...  deal with other directions that need reversing ... 
       }
    }
    return curDirection;
}

另一种选择是实现两个类,其中一个执行&#34;反向开关&#34;,另一个只返回当前方向而不反转。