问题已经改变了!
我使用一种简单的方法从本地命名空间隐藏我的枚举 - 结构内部的枚举。它大致如下:
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;
};
运算符T()是对隐式类型转换的保护。然后我尝试用gcc和keil编译这段代码:
Color n;
int a[9];
a[ (int)n ] = 1;
gcc编译它没有错误(这是我的预期),但Keil给了我一个错误: “无效的类型转换。操作符()无法访问”。
所以我的问题是:哪个编译器是对的?
我知道c ++ 11枚举类,但现在不支持Keil
答案 0 :(得分:4)
应该reinterpret_cast(不是c-style()强制转换)调用类型转换运算符?
不,reinterpret_cast
仅用于一些狡猾的转换类型:
您根本不需要使用隐式转换运算符 - 您根本没有阻止隐式转换。在C ++ 11中,如果运算符为explicit
,那么您需要static_cast
。
如果您坚持使用C ++ 03,并且您确实希望阻止隐式转换但允许显式转换,那么我认为唯一明智的做法是提供命名转换函数。
更新:问题现在已经改变,并且询问C风格的投射而不是reinterpret_cast
。这应该编译,因为static_cast
可以完成的任何转换(包括隐式转换)也可以使用C风格的转换来完成。