【发布时间】:2015-12-08 09:34:24
【问题描述】:
我正在尝试创建一个可以在 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;
}
编译得很好。现在我正在尝试在不破坏与 armcc 的兼容性的情况下迁移到更新版本的 gcc。
但是现在 gcc 给了我这个:
error: ambiguous default type conversion from 'Test'
switch(t)
^
error: candidate conversions include 'template<class T> Test::operator T() const'
由于模板运算符没有正文,我无法真正理解歧义在哪里。
有没有办法解决这个问题?
【问题讨论】:
-
重载解析不关心函数是否有定义。最简单的修复方法是
switch (static_cast<int>(t))。 -
使用实际演员表是我最后的手段;我想不惜一切代价避免它。
-
只是摆脱
template<typename T> operator T() const;?或者您在其他地方是否有其他函数为不同类型重载该运算符? -
在结构隐藏枚举的实际代码中(有点枚举类),所以实际上我需要允许转换为枚举并禁用其他所有内容。如果我读过模板运算符,不同枚举之间会有隐式转换,我不希望这样。
-
您应该考虑升级您的编译器(例如,在 2015 年 12 月升级到 GCC 5.3)。您可以从gcc.gnu.org 下载一些更新的编译器源代码并构建一个交叉编译器。