1

在以下代码中:

#include "itkImage.h"
#include "itkImageRegionIterator.h"

struct CustomImageBase
{
  virtual void DoSomething() = 0;
};

template <typename TPixel>
struct CustomImage : public itk::Image<TPixel, 2>, public CustomImageBase
{
  void DoSomething()
  {
    itk::Index<2> index;
    index.Fill(0);
    std::cout << this->GetPixel(index);
  }
};

int main(int, char *[])
{
  std::vector<CustomImageBase*> images;

  CustomImage<float>* floatImage = CustomImage<float>::New().GetPointer();
  CustomImage<int>* intImage = CustomImage<int>::New().GetPointer();

  return EXIT_SUCCESS;
}

我收到错误:从 itk::Image* 到 CustomImage* 的无效转换

请注意,这可以正常工作:

itk::Image<float>* testFloatImage = itk::Image<float>::New().GetPointer();

由于CustomImage继承自itk::Image,我不明白这个问题?

4

3 回答 3

1

由于CustomImage继承自itk::Image,我不明白这个问题?

由于CustomImage继承自itk::Image,这意味着CustomImage*可以隐式转换为itk::Image*。但是,编译器抱怨相反的转换:

到 的无效转换itk::Image* CustomImage*

这需要显式类型转换。

我无法编译你的代码,因为我没有先决条件,而且你没有说编译器不喜欢哪一行代码,所以目前很难提供进一步的帮助。

于 2012-01-10T20:43:17.057 回答
1

如果B源自A,则无法转换A*B*。如果C也派生自A,并且您A*确实指向C对象而不是B对象,那么如果您假装它是会发生什么B?转换是不安全的。在您的情况下,知道这GetPointer()将始终返回 a CustomImage<T>。编译器不知道这一点。您可以通过使用演员来告诉它:

CustomImage<float>* floatImage = static_cast<CustomImage<float>*>(CustomImage<float>::New().GetPointer());

编辑:这正是转换不安全的原因:在阅读了关于您问题的评论后,我不相信CustomImage<float>::New().GetPointer()真的指向 aCustomImage,如果不是,则转换只会将编译器错误转换为运行时错误。

于 2012-01-10T20:44:01.500 回答
0

假设这是允许的。现在考虑以下几点:

struct yet_another_image : public itk::Image<TPixel, 2> {
}

yet_another_image img;
itk::Image<TPixel, 2>* ptr = &img; // ok
CustomImage* bad = ptr; // oops!

您可以安全地将指向派生类的指针转换为指向基类的指针,但不能安全地反过来进行转换,因为您不知道指向的对象是否具有正确的类型。

于 2012-01-10T20:48:10.157 回答