转换为枚举类型需要显式转换(static_cast,C风格转换或函数样式转换)枚举

时间:2015-05-22 13:28:25

标签: c++ visual-c++ c++builder

我已经将从结构外部声明的枚举类型的变量数据复制到了内部结构中写入的枚举类型变量,但是由于转换为枚举类型需要显式强制转换(static_cast,C样式强制转换),因此抛出构建错误或函数式演员)

enum TGenObjType                        //sundar
{
   TYPE_UNDEFINED 
   , TYPE_CAR      
    , TYPE_TRUCK     
    , TYPE_MOTORBIKE 
   , TYPE_BIKE      
  , TYPE_PEDESTRIAN
  };

struct SGenObjData
{
  enum TGenObjType                recogType                          ; /* #RTAS: input               */ /* Object type (vehicle, pedestrian, ...)                                      */
  enum TGenObjType                commuType                          ; /* #RTAS: input               */ /* Object type (vehicle, pedestrian, ...)                                      */
}; 


 ushort j(0);
   for (ulong i = 0; i < gol.mData.size(); ++i)
 {
   if (gol.mData[i].isValid > 0)
    {
     if (gol.mData[i].id <= OBJ_MAX_ID)
     {
        objectList.objectIdx[size_t(gol.mData[i].id)][size_t(SRC_LIST1)]           = ushort(j);

             switch (gol.mData[i].recognized_shape)
            {
            case EO_SHAPE_CAR       : objectList.objects[j].recogType =    TYPE_CAR           ; break;
            case EO_SHAPE_TRUCK     : objectList.objects[j].recogType = TYPE_TRUCK         ; break;
            case EO_SHAPE_MOTORBIKE : objectList.objects[j].recogType = TYPE_MOTORBIKE ; break;
           case EO_SHAPE_BIKE      : objectList.objects[j].recogType = TYPE_BIKE      ; break;
           case EO_SHAPE_PEDESTRIAN: objectList.objects[j].recogType = TYPE_PEDESTRIAN; break;
            case EO_SHAPE_UNDEFINED :                                                                  
            default                 :    myDataLst.objectList.objects[j].recogType =    TYPE_UNDEFINED ;
         }// throwing an error Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)

谁能告诉我出了什么问题?

1 个答案:

答案 0 :(得分:2)

命名enum是一种不同的类型。它有一个底层类型和一个“弱”enum允许隐式转换底层类型。它不支持从基础类型到enum的隐式转换。声明与另一个enum具有相同名称但在不同scopr中的enum是其自身的不同类型(这适用于所有类型)。由于enum不支持从基础类型隐式转换,因此您无法简单地将一个enum的值分配给另一个,即使enum和他们所有的成员都有相同的名字和价值观。

enum Foo
{
    Bar = 0
};

不同
struct Object
{
    enum Foo
    {
        Bar = 0
    };
};

FooObject::Foo都是不同的类型,C ++不允许在它们之间进行隐式转换。

Object:Foo innerFoo = Bar; // Error Bar and Object::Bar are not the same

Object:Foo innerFoo = Onject::Bar; // OK! They are the same!

听起来两个enum是多余的,因此您需要决定要使用哪个版本的TGenObjType并删除另一个版本。