在switch语句中使用struct

时间:2015-12-08 09:34:25

标签: c++ gcc c++03

我正在尝试创建一个可以在switch语句中使用的结构。我正在使用一堆像keil armcc和老式的gcc 4.7.1这样的奇怪的编译器。

这也意味着c ++ 11不是一个选项。

有一段时间,这个想法确实奏效了:

struct Test
{
    const int a;

    Test() : a(1) {}

    template<typename T>
    operator T() const;

    operator int() const {return a;}

};

...

Test t;

switch(t)
{
case 1:
    break;
}

编译得很好。现在我试图转移到更新版本的gcc而不破坏与armcc的兼容性。

但是现在gcc给了我这个:

error: ambiguous default type conversion from 'Test'
 switch(t)
         ^
error:   candidate conversions include 'template<class T> Test::operator T() const'

由于模板操作符没有正文,我无法理解模糊性在哪里。

有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您可以指定临时int:

int n = t;
switch (n) {
   ...
}

switch (t)的上下文中,编译器会将强制视为整数类型,包括intunsigned intlong。通过分配类型为int的变量,我们折叠波函数强制它选择我们想要的转换,当我们到达{{1}时没有歧义}}

如果可以,您还应该认真考虑制作模板转化运算符switch,因为全面转换会导致令人不快的意外。

答案 1 :(得分:0)

switch(t)
{
case 1:
    break;
}

这里编译器不知道要调用的转换运算符;它含糊不清。它可以为几种不同的整数类型实例化模板化转换运算符,也可以调用int转换运算符。模板化转换运算符函数未定义这一事实对于重载决策并不重要。

最简单的解决方案是使用switch (static_cast<int>(t))