我正在尝试switch
自定义类型。标准说
条件应为整数类型,枚举类型或a 一个非显式转换函数的类类型 存在整数或枚举类型(12.3)。如果条件是 类类型,通过调用该转换来转换条件 功能,并使用转换的结果代替 本节其余部分的原始条件。积分 促销活动。
这表明对enum
类型具有一个隐式转换函数的类型应该是有效的switch
表达式。但是当我尝试使用这个措辞时,Visual Studio会给出关于切换表达式是非整数的错误。 VS在这个领域是不合规的吗?
类类型的定义是
struct Token {
Token()
: line(0)
, columnbegin(0)
, columnend(0) {}
Token(const Codepoint& cp) {
*this = cp;
}
template<typename Iterator> Token(Iterator begin, Iterator end) {
columnend = 0;
columnbegin = 0;
line = 0;
while(begin != end) {
*this += *begin;
begin++;
}
}
operator TokenType() {
return type;
}
Token& operator+=(const Codepoint& cp) {
if (cp.column >= columnend)
columnend = cp.column;
if (columnbegin == 0)
columnbegin = cp.column;
Codepoints += cp.character;
if (line == 0)
line = cp.line;
return *this;
}
Token& operator=(const Codepoint& cp) {
line = cp.line;
columnbegin = cp.column;
columnend = cp.column;
Codepoints = cp.character;
return *this;
}
int line;
int columnbegin;
int columnend;
TokenType type;
string Codepoints;
};
switch(*begin)
作为begin
为vector<Token>::iterator
的错误行。
编辑:
请阅读问题。你想看看我的代码吗?我在这个正上方的行中所说的流血明显怎么样?也许我应该用粗体和斜体字来表示五十个字母。
std::vector<Token>::iterator begin = vector.begin();
switch(*begin) {
case TokenType::stuff:
}
答案 0 :(得分:2)
看起来像VC中的错误。 GCC 4.5和4.7编译它,没有问题:
enum class e { roy, gee, biv };
struct s { operator e() { return e::gee; } };
void f() {
switch ( s() ) {
case e::roy: case e::biv: case e::gee: break;
}
}
这个更小的测试用例是否也让VC开心?