在switch中使用类类型

时间:2011-12-10 10:53:25

标签: c++ visual-studio-2010 c++11

我正在尝试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)作为beginvector<Token>::iterator的错误行。

编辑:

请阅读问题。你想看看我的代码吗?我在这个正上方的行中所说的流血明显怎么样?也许我应该用粗体和斜体字来表示五十个字母。

std::vector<Token>::iterator begin = vector.begin();
switch(*begin) {
case TokenType::stuff:
}

1 个答案:

答案 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开心?