我有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; }
这使我可以写出错误代码isOne<StoresValueAsInt::value>()
。相反,我想让编译器抱怨这种不正确的用法。我试过如下:
enum ValueInt {
kOne = 1
};
enum ValueChar {
kOne = '1'
};
class StoresValueAsInt {
static ValueInt value;
};
class StoresValueAsChar {
static ValueChar value;
};
class StoresValueAsChar2 {
static ValueChar value;
};
然而,这不起作用,因为通力是可见的命名空间级别,因此它具有通力冲突的声明。
有没有办法在命名空间中声明枚举?或者更好的方法在这里?
已更新:增加了我目前所做的;希望澄清我的用例。
编译器不会抱怨'char'和'INT之间的比较'因为'char'是一个'unsigned int'(或者在某些系统上是'unsigned short') – Chad 2011-05-05 20:35:35
是的,那么编译器不会抱怨第一个版本中的错误。这就是为什么我想定义枚举来进行类型检查的原因;编译器会认为ValueInt和ValueChar是不同的... – hrr 2011-05-06 02:29:24
看我的解决方案然后 – Chad 2011-05-06 02:40:48