【问题标题】:C++ Namespace 'using' declarative for a class' enumC ++命名空间'使用'声明类'枚举
【发布时间】:2011-09-12 00:09:52
【问题描述】:

我非常了解 C++ 'using' 声明和指令的工作原理。但是,我对此感到困惑......也许这是不可能的?我想避免质量我的枚举变量:

namespace Foo { 
   class MyClass {
      public: 
         enum MyEnum { X, Y, Z };
   }
}

现在,在该命名空间之外,我希望能够执行以下操作:

using Foo::MyClass.MyEnum;
MyEnum letter = MyEnum::x;

但显然这不是这样做的方法吗?我打赌这是可能的,但我的符号是错误的......我也尝试使用 Foo::MyClass::MyEnum,但编译器认为 Foo::MyClass 是一个命名空间。

补充:如您所见,必须完全声明所有内容会变得很烦人...

Foo::MyClass::MyEnum value = Foo::MyClass::X;

【问题讨论】:

  • 您尝试将using 放在哪里?在课堂内,还是?
  • using declaration with enum? 的可能重复项
  • @Kiril,在一个不在 Foo 命名空间中的不同类中的方法内部。

标签: c++ namespaces


【解决方案1】:

这并不能直接回答您的问题,但如果您想节省击键次数,您可以尝试使用 typedef。

typedef Foo::MyClass::MyEnum MyClassEnum;

顺便说一句,它看起来像your question has been asked on Stack Overflow before。从那个问题的答案:

一个类没有定义一个命名空间, 因此“使用”不适用 在这里。

【讨论】:

  • 我认为您应该将点 (.) 替换为 :: aftert MyClass
  • @Kiril:感谢您指出这一点。我想这就是我复制和粘贴的结果。 :)
  • 我在发布之前阅读了那篇文章,但它似乎没有解决我的担忧,即该类位于命名空间内,并且命名空间外的客户端希望包含该特定枚举。我知道枚举器不会自动带入本地范围,没关系。
  • 是的,我想我可以 typedef 它。如果由于某种原因无法做到,那么我想这将是最好的解决方案......
【解决方案2】:

在搞砸了很多之后,我得到了以下编译。我认为这将是您在没有 typedef 的情况下可以获得的最接近的结果。

namespace Foo {
    class MyClass {
        public:
            enum MyEnum { X, Y, Z };
    };
};

namespace Foo2 {
    using Foo::MyClass; 

    class AnotherClass {
        public:

            AnotherClass(){
                MyClass::MyEnum value = MyClass::X; 
            }
    };
};

int main(){

    return 1;
}

您也可以使用 MyClass 作为基类,但我怀疑这是您想要做的事情。

namespace Foo2 {
    using namespace Foo;
    class AnotherClass : public MyClass{
        public:
            AnotherClass(){
                MyEnum value = X; 
            }
    };
};

这也有一些很好的信息。 namespaces for enum types - best practices

【讨论】:

  • 我超前了,误解了你的目的。
  • 感谢您的输入 - 但是,就像您说的那样,我宁愿在没有 MyClass 范围运算符的情况下使用 MyEnum。努力点虽然:-)
【解决方案3】:

C++03 不支持完全限定 enum 类型,但它是一个 MSVC 扩展。 C++0x 将成为这个标准,我相信您可以在 C++0x 中使用usingenum。但是,在C++03中,我不相信你的问题可以解决。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2011-06-14
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多