4

ヘッダーのクラス内に列挙型定義があります。

namespace A {

class B {
 public:
  enum Value {
    VALUE1 = 1,
    VALUE2 = 2,
  };
};

}

そして、次のように、接頭辞なしでソースファイルでその値を使用したい:

#include "header"

int main() {
  someFn(VALUE1);

  return 0;
}

しようとしましusing A::B::Value;たが、clang でエラーが発生します。

using 宣言はクラス メンバーを参照できません


列挙型をクラスの外に移動しても:

namespace A {

enum Value {
  VALUE1 = 1,
  VALUE2 = 2,
};    

}

と do using A::Value;、エラーはなくなりましたが、コンパイラーは次のことについて不平を言いますVALUE1:

宣言されていない識別子「VALUE1」の使用

列挙型が別の場所で定義されている場合、プレフィックスなしで列挙型の値を使用する方法はありますか? - #defines の使用は論外です。

方法がない場合、C++ 標準でそのような動作を実装する際に考えられる問題は何ですか?

4

4 に答える 4

4

アプローチが失敗する理由は 2 つあります。

  1. 最初の理由は BЈовић によって説明されています: 名前空間スコープにネストされた型の名前を導入することはできません。[namespace.udecl]/8 を参照してください。

  2. を記述すると、すべての列挙子の名前ではなくusing A::B::Value;、それ自体の名前のみがenum現在のスコープに導入されます。これにより、次のことが可能になります。

    namespace Values { enum Value{ VALUE1, VALUE2 }; }
    using Values::Value;  // don't pollute my scope with the enumerators
    
    Value v = Values::VALUE1;
    

2 番目の問題は、列挙子を個別に導入することで解決できます。

namespace A
{
    namespace B
    {
        enum Value
        {
              VALUE1
            , VALUE2
        };
    }
}

int main()
{
    using A::B::Value;
    using A::B::VALUE1;
    using A::B::VALUE2;

    Value v = VALUE1;
    v = VALUE2;
}

または、hvdがコメントで示唆しているように、using-directive を使用して名前空間のすべての名前を導入できます。

namespace A
{
    namespace B
    {
        enum Value
        {
              VALUE1
            , VALUE2
        };
    }
}

int main()
{
    using namespace A::B;

    Value v = VALUE1;
    v = VALUE2;
}
于 2013-11-10T11:37:34.450 に答える
3

簡単に言えば、列挙型がクラスで定義されているため、不可能です。

class Bを に変更した場合namespace B:

namespace A {

namespace B {
  enum Value {
    VALUE1 = 1,
    VALUE2 = 2,
  };
};

}

次に、次のことが可能になります(コードに書いたように):

using A::B::Value
于 2013-11-10T07:53:35.510 に答える
0

さて、私が考えることができる最も近いものは次のとおりです。

namespace A {
  class B {
  public:
    enum Value { VALUE1 = 1, VALUE2 = 2 };
  };
};

const A::B::Value VALUE1 = A::B::VALUE1;

int main () {
  return VALUE1;
}

しかし、それはかなり退屈でエラーが発生しやすく、絶対に価値がありません。:)

于 2013-11-10T10:38:51.060 に答える
0

列挙型はクラスと同じように扱われます。次のことをしようとしていると考えてください。

class Value
{
public:
    static const int VALUE1 = 0;
};

using Value::VALUE1; // ERROR class-qualified name

要するに、usingステートメントを使用してこの方法で列挙値を表示することはできません。

于 2013-11-10T08:04:46.817 に答える