我正在尝试创建一个可以在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'
由于模板操作符没有正文,我无法理解模糊性在哪里。
有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
您可以指定临时int:
int n = t;
switch (n) {
...
}
在switch (t)
的上下文中,编译器会将强制视为整数类型,包括int
,unsigned int
,long
。通过分配类型为int
的变量,我们折叠波函数强制它选择我们想要的转换,当我们到达{{1}时没有歧义}}
如果可以,您还应该认真考虑制作模板转化运算符switch
,因为全面转换会导致令人不快的意外。
答案 1 :(得分:0)
switch(t)
{
case 1:
break;
}
这里编译器不知道要调用的转换运算符;它含糊不清。它可以为几种不同的整数类型实例化模板化转换运算符,也可以调用int
转换运算符。模板化转换运算符函数未定义这一事实对于重载决策并不重要。
最简单的解决方案是使用switch (static_cast<int>(t))
。