【发布时间】:2013-05-16 07:12:49
【问题描述】:
问题改了!
我使用一种简单的方法将我的枚举隐藏在本地命名空间中 - 在结构中进行枚举。大致是这样的:
struct Color
{
enum Type
{
Red, Green, Black
};
Type t_;
Color(Type t) : t_(t) {}
operator Type () const {return t_;}
private:
template<typename T>
operator T () const;
};
operator T () 是对隐式类型转换的保护。然后我尝试用 gcc 和 keil 编译这段代码:
Color n;
int a[9];
a[ (int)n ] = 1;
gcc 编译它没有错误(这是我所期望的),但 Keil 给了我一个错误: “无效的类型转换。运算符()不可访问”。
所以我的问题是:哪个编译器是正确的?
我知道 c++11 枚举类,但现在 Keil 不支持它
【问题讨论】:
-
g++ 和 clang++ 都没有为我编译这段代码,即使在修复了
Color n;的定义之后。 -
您使用的是什么版本的 g++?有什么错误?
-
invalid cast from type ‘Color’ to type ‘int’: GCC 4.6.3、4.7.2、4.8.0;reinterpret_cast from 'Color' to 'int' is not allowed:铿锵3.3 -
现在很有趣。我实际上将这个东西与宏一起使用并且它确实编译了。但是我尝试了这个简单的 sn-p 并没有。我糊涂了。 UPD:是的,c 风格的转换在 g++ 中有效,但在 Keil 中无效。我应该在提问之前测试代码:(问题应该是关于 C 风格的转换
-
我不确定这是否与它有关,但在 stackoverflow.com/questions/573294/when-to-use-reinterpret-cast 上我发现了这条评论,“在 C++03 中,
int*到void*的演员被禁止用 reinterpret_cast 来完成(尽管编译器没有实现它并且不切实际,因此针对 C++11 进行了更改)”。由于结构涉及指向对象的指针。可能 Keil 不喜欢它的原因是因为那个 C++03 标准。