Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用枚举进行类型检查--如何正确地确定作用域 < >我有C++类的混合,其中一些存储状态变量0…9作为整数,其他使用“0”…9'. 目前我有: enum { kOne = '1' }; class StoresValueAsInt { static int value; // contains 0 ... 9 }; class StoresValueAsChar { static char value; // contains '0' ... '9' }; class StoresValueAsChar { static char value; }; template <typename X> isOne() { return X::value == kOne; }_C++_Enums_Scope_Type Safety - Fatal编程技术网

使用枚举进行类型检查--如何正确地确定作用域 < >我有C++类的混合,其中一些存储状态变量0…9作为整数,其他使用“0”…9'. 目前我有: enum { kOne = '1' }; class StoresValueAsInt { static int value; // contains 0 ... 9 }; class StoresValueAsChar { static char value; // contains '0' ... '9' }; class StoresValueAsChar { static char value; }; template <typename X> isOne() { return X::value == kOne; }

使用枚举进行类型检查--如何正确地确定作用域 < >我有C++类的混合,其中一些存储状态变量0…9作为整数,其他使用“0”…9'. 目前我有: enum { kOne = '1' }; class StoresValueAsInt { static int value; // contains 0 ... 9 }; class StoresValueAsChar { static char value; // contains '0' ... '9' }; class StoresValueAsChar { static char value; }; template <typename X> isOne() { return X::value == kOne; },c++,enums,scope,type-safety,C++,Enums,Scope,Type Safety,但是,这不起作用,因为通力在名称空间级别是可见的,因此它具有相互冲突的通力声明 有没有办法不在名称空间中声明枚举?还是更好的方法 更新:添加了我目前正在做的事情;希望澄清我的使用案例。就最佳实践而言,我真的不确定您在这里想要实现什么,所以我无法为您指出正确的方向 但是,要直接回答您的问题:将枚举放在单独的名称空间中可以解决您的问题: namespace IntVals { enum ValueInt { kOne = 1 }; } namespace CharVals {

但是,这不起作用,因为通力在名称空间级别是可见的,因此它具有相互冲突的通力声明

有没有办法不在名称空间中声明枚举?还是更好的方法


更新:添加了我目前正在做的事情;希望澄清我的使用案例。

就最佳实践而言,我真的不确定您在这里想要实现什么,所以我无法为您指出正确的方向

但是,要直接回答您的问题:将枚举放在单独的名称空间中可以解决您的问题:

namespace IntVals {
   enum ValueInt {
      kOne = 1
   };
}
namespace CharVals {
   enum ValueChar {
      kOne = '1'
   };
}

class StoresValueAsInt {
   static ValueInt value;
};
class StoresValueAsChar {
   static ValueChar value;
};
然后,您应该能够使用以下各项:

StoresValueAsInt::value == CharVals::kOne

虽然这很难看,但我希望我能更好地理解您的意图,提供一个比这更优雅的解决方案。

就最佳实践而言,我真的不确定您在这里想要实现什么,因此我无法为您指出正确的方向

但是,要直接回答您的问题:将枚举放在单独的名称空间中可以解决您的问题:

namespace IntVals {
   enum ValueInt {
      kOne = 1
   };
}
namespace CharVals {
   enum ValueChar {
      kOne = '1'
   };
}

class StoresValueAsInt {
   static ValueInt value;
};
class StoresValueAsChar {
   static ValueChar value;
};
然后,您应该能够使用以下各项:

StoresValueAsInt::value == CharVals::kOne
虽然这很难看,但我希望我能更好地理解您的意图,提供比这更优雅的解决方案

有没有办法不在名称空间中声明枚举?还是更好的方法

是的,您可以按如下方式区分枚举:

struct ValueInt {
  enum {  // no need to have enum Name
    kOne = 1
  };
};
struct ValueChar {
  enum {  // no need to have enum Name
    kOne = '1'
  };
};
用法:

ValueInt::kOne;
ValueChar::kOne;
有没有办法不在名称空间中声明枚举?还是更好的方法

是的,您可以按如下方式区分枚举:

struct ValueInt {
  enum {  // no need to have enum Name
    kOne = 1
  };
};
struct ValueChar {
  enum {  // no need to have enum Name
    kOne = '1'
  };
};
用法:

ValueInt::kOne;
ValueChar::kOne;

编译器不会抱怨
char
int
之间的比较,因为
char
unsigned int
(或
unsigned short
在某些系统上)是的,那么编译器不会抱怨第一个版本中的错误。这就是为什么我想定义枚举进行类型检查;编译器会认为ValueIt和ValueChar是不同的……是的,我正在使用你的解决方案——正如你所说的“这很难看”。所以我最初的希望是有一个更优雅的解决方案……编译器不会抱怨
char
int
之间的比较,因为
char
unsigned int
(或者
unsigned short
在某些系统上)是的,然后编译器不会抱怨第一个版本中的错误。这就是为什么我想定义枚举进行类型检查;编译器会认为ValueIt和ValueChar是不同的……是的,我正在使用你的解决方案——正如你所说的“这很难看”,所以我最初的希望是有一个更优雅的解决方案…