문제

내 클래스 중 하나의 메서드 내에서 열거형의 정규화된 이름을 사용하고 있습니다.하지만 다음과 같은 컴파일러 경고가 표시됩니다. "경고 C4482:비표준 확장이 사용됨:정규화된 이름에 enum 'Foo'가 사용됨".C++에서는 정규화된 이름 없이 열거형을 사용해야 합니까?하지만 IMO는 보기 흉해 보입니다.

이견있는 사람?

도움이 되었습니까?

해결책

예, 열거는 새로운 "네임 스페이스"를 생성하지 않으며, 열거의 값은 주변 범위에서 직접 사용할 수 있습니다. 그래서 당신은 얻는다 :

enum sample {
  SAMPLE_ONE = 1,
  SAMPLE_TWO = 2
};

int main() {
  std::cout << "one = " << SAMPLE_ONE << std::endl;
  return 0;
}

다른 팁

깨끗하게 만들려면 교체하십시오.

enum Fruit {

    ORANGE = 0,
    BANANA = 1

};

~와 함께

namespace Fruit {

    enum { //no enum name needed

        ORANGE = 0,
        BANANA = 1

    };

};

...

int f = Fruit::BANANA; //No warning

sth는 질문에 대답하지만 내가 항상 열거형을 사용하는 방법을 다루지는 않았습니다.비록 숫자에 대한 이름일 뿐이지만 나는 항상 특정 값만 가질 수 있는 유형을 정의하는 데 사용했습니다.

열거형이 클래스의 일부인 경우 소비자가 열거형 참조를 명확하게 식별하는 데 도움이 됩니다.

class Apple {
  enum Variety {
    Gala,
    GoldenDelicious,
    GrannySmith,
    Fuji
  }
  ...
};

그러면 소비자는 열거형의 인스턴스를 선언하고, 매개변수로 전달하고, 유형 중 하나를 참조할 때 이를 한정할 수 있습니다.

unsigned int GetCountOfApples( Apple::Variety appleVariety );
...
fujiCnt = GetCountOfApples( Apple::Fuji );

때로는 클래스 외부에 열거형이 필요하거나 같은 클래스에 두 개의 열거형이 필요한 경우 Poy가 했던 것과 같은 작업을 수행할 수 있습니다.하지만 열거형 유형은 참조할 수 없으므로 이름만 지정하세요.

namespace Color {
  enum ColorEnum {
    Blue,
    Red,
    Black
  };

이제 열거형과 값을 사용하면 다음과 같이 작동합니다.

Color::ColorEnum firstColor = Color::Blue;
Color::ColorEnum secondColor = Color::Red;

if( firstColor == secondColor )
....

이제 동일한 이름을 가진 다른 열거형이 있는 경우 항상 해당 유형으로 한정됩니다.그러면 도박꾼이 요구하는 내용을 처리할 수 있습니다.

BananaColorEnum banCol = BananaColor::Yellow;
TomatoColorEnum tomCol = TomatoColor::Yellow;

예. 개념적으로 열거는 유형과 해당 유형의 가능한 값을 정의합니다. 자연스럽게 보이지만 정의하는 것이 좋습니다 enum foo { bar, baz }; 그런 다음 참조하십시오 foo::baz 참조와 동일합니다 int::1.


namespace Company
{
    typedef int Value;
    enum
    {
        Microsoft= 0,
        APPLE = 1, 
    };
};

namespace Fruit
{
    typedef int Value;
    enum
    {
        ORANGE = 0,
        BANANA = 1,
        APPLE = 2, 
    };
};

...

Fruit::Value f = Fruit::BANANA; //No warning
Company::Value f = Company::APPLE; //is different value then Fruit::APPLE

이것은 GCC 및 MS 컴파일러 및 Mac에서 작동합니다. 그리고 장점은 네임 스페이스 연산자를 사용하고 충돌을 통과 할 수 있다는 것입니다. 작은 단점은 과일 대신 과일 :: 가치를 써야한다는 것입니다. 다른 클래스에서 열거가 무엇인지 모르는 경우 큰 프로젝트에서 더 유용합니다.

대신 C ++ 11을 사용할 수 있다면 Enum :: Namespace 구문이 가능하기 때문에 훨씬 더 간단합니다.

내가 이것을하는 가장 깨끗한 방법은 열거를 정의하는 것입니다.

namespace Samples
{
    enum Value
    {
        Sample1,
        Sample2,
        Sample3
    };
}
typedef Samples::Value Sample;

그런 다음 함수 및 변수 정의에서 typedef를 사용할 수 있습니다.

void Function(Sample eSample);
Sample m_eSample;

.CPP 파일에서 네임 스페이스를 사용하여 변수를 할당 할 수 있습니다.

void Function(Sample eSample)
{
    m_eSample = Samples::Sample1;
    eSample = Samples::Sample2;
}

개인적으로, 나는 이것이 컴파일러 버그라고 생각합니다. 나는 많은 시간 동안 C ++를 사용하고 있습니다. 안타깝게도 OP의 샘플 코드가 없습니다. 자바 사람들에 의한 열거의 해석은 실제로 정확한 IMO였습니다. 내 것, 이렇게 ...

class Foo {
    enum tMyEnum { eFirstVal = 0, eSecondVal = 1};
    // ...
    tMyEnum m_myVal;
};
void Foo::MyMethod() {
    if(m_myVal == tMyEnum::eFirstVal) {
//  ...
    }
}

나는 또한 foo :: tmyenum :: efirstval을 시도했습니다. 예선이 없으면 모든 것이 편집되었습니다.

나는 같은 문제가 있었고 아직 C ++ 11을 사용하지 않습니다. 나는 완전히 자격을 갖춘 네임 스페이스를 직접 선호합니다.

이 특정 경고를 비활성화했습니다. 나는 사람들이 아이디어를 싫어할 것이라고 확신하지만 일부는 감사 할 수 있습니다 ..

#pragma warning( disable : 4482 )
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top