【问题标题】:Invalid type conversion using static_cast, what proper casting should I use?使用 static_cast 的类型转换无效,我应该使用什么正确的转换?
【发布时间】:2013-01-14 05:48:12
【问题描述】:

我有一个typedef vector<Object*> ObjList; 的类型定义我还有一个函数vector<BigObject*>* ObjectBox::getBigObjectList();BigObject 继承自 Object

我想要做的是从getBigObjectList() 得到一个vector<BigObject*>* 并将其转换为vector<Object*>*,这是一个向上转换,这种类型被定义为ObjList 所以我基本上想转换它变成ObjList 类型

我尝试了两种方法,第一种是

ObjList *normalObjectList = (ObjList*) box->getBigObjectList();

这是编译后我从这篇文章 (When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?) 中读到的,它说 C 风格的转换很少需​​要,因为它可以被开发成 reinterpret-cast

然后我尝试使用static_cast,但是我得到一个错误说无效类型转换

ObjList *normalObjectList = static_cast<ObjList*> (box->ClipObjectInRect());

这也行不通

ObjList *normalObjectList = static_cast<vector<Object*>*> (box->ClipObjectInRect());

为什么这不起作用?这是因为static_cast 只能用于转换直接类(如Object 本身)而不是嵌套类(我只是在这里完全猜测)?这种情况我该怎么办?

【问题讨论】:

  • static_cast 不能转换为不相关的类型
  • @DenisErmolin 我不知道你所说的无关类型究竟是什么意思,因为它们是继承类型的向量并且使用typedef 明确定义。

标签: c++ casting typedef static-cast


【解决方案1】:

如果编译器不知道(或假装不知道)类型之间的关系,静态转换也会失败。如果您的继承未在两者之间声明为 public,编译器会将它们视为不相关的类型并给您同样的神秘警告。

这只是咬我,所以想我会分享。

【讨论】:

    【解决方案2】:

    你的推理有一个非常常见的缺陷;我想我们都曾在某个时候犯过同样的错误。您认为std::vector&lt;&gt; 只是一个输出容器,因为这是您现在想要使用它的方式,但事实并非如此。

    想象一下下面的代码会编译:

    vector<BigObject*>* bigVector = box->ClipObjectInRect(); // OK
    ObjList* objVector = static_cast<ObjList*>(bigVector);   // Not OK; we'll now see why
    objVector->push_back(new SmallObject()); // OUCH
    

    如您所见,允许该转换将允许您尝试将SmallObject* 放入只能包含BigObject* 的内容中。这肯定会导致运行时错误。

    顺便说一句:您实际上可以在相关类型的数组之间进行转换。这是从 C 继承的行为。它会导致运行时错误:)

    【讨论】:

      【解决方案3】:

      我可能是错的,但我认为您可能需要将每个单独的对象投射到向量中。我会尝试重载 getBigObjectList() 以返回 ObjList*。所以你的重载函数看起来像

      ObjList* ObjectBox::getBigObjectList()
      {
       vector<Object*> return_vec
       for(vector<BigObject*>::iterator itr = ObjectBox.bigObjectList.begin(); itr != ObjectBox.bigObjectList.end(); itr++)
       {
        return_vec.push_back(static_cast<Object*> (itr));
       }
       return return_vec
      }
      

      您将向量描述为列表的任何特殊原因?还是首先使用向量而不是列表?

      编辑:基本上,丹尼斯所说的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2015-10-06
        • 2012-06-14
        • 1970-01-01
        • 2011-10-14
        • 1970-01-01
        相关资源
        最近更新 更多