Я пытаюсь удалить предупреждения из класса, над которым я работаю.
Предупреждение выглядит следующим образом:
Предупреждение C4482: используется нестандартное расширение: enum 'MyEnum' используется в квалифицированном имени
Я понимаю, что предупреждениевызван попыткой доступа к одному из значений в перечислении, например так:
//Declared in a C header file.
enum MyEnum
{
Value1,
Value2,
Value3
};
//Exists in some other .cpp file.
void SomeFunc()
{
MyEnum::Value1; //Generates warning C4482
}
К вашему сведению: SomeFunc () существует в файле .cpp, но перечисление объявлено в файле заголовка C.
Таким образом, один из способов удалить предупреждение - это заменить MyEnum :: Value1 только на Value1.Однако я бы предпочел ссылаться на значения перечисления с помощью MyEnum :: Value1, так как мне нравится, что он более явный.
Так что, если бы я использовал только C ++, я мог бы изменить перечисление следующим образом:
namespace MyEnum
{
enum
{
Value1,
Value2,
Value3
};
}
Однако перечисление существует в заголовочном файле C, поэтому я не могу обернуть перечисление в пространство имен.Я также не могу переместить перечисление в заголовочный файл C ++, так как другие файлы уже зависят от перечисления.
Один из способов, который я рассмотрел, заключался в переносе перечисления в структуру:
struct MyEnum
{
enum Type
{
Value1,
Value2,
Value3
};
};
Что позволило бы мне получить доступ к значениям с помощью MyEnum :: Value1 без предупреждения.
Однако, есть ли лучший способ добиться этого?
Кроме того, у меня также были ситуации, когда enum существовал в файле C ++, но он был ограничен классом:
class MyClass
{
enum MyEnum
{
Value1,
Value2,
Value3
};
};
Я не хочу перемещать его из класса, потому что класс обеспечивает инкапсуляцию для перечисления, но я также не могу обернуть перечисление в пространство имен, потому что пространства имен не допускаются в объявлении класса.Есть ли лучший способ реализовать такое же поведение (MyEnum :: Value1) в этой ситуации, не вызывая того же предупреждения?
FYI2: я ограничен реализациями, которые разрешены vc10.